Soy bastante nuevo en Python y busco ayuda con respecto a mi tarea.

Aquí está el aviso exacto del profesor:

Tanto start_ip como end_ip deben ser números enteros de 12 dígitos. Eso es para facilitar la búsqueda de IP. Primero divida la dirección IP en períodos, luego agregue ceros a cada número para que cada uno de ellos tenga tres dígitos, es decir, la cadena 102.1.2.0 se convierte en el número entero 102001002000. Sugerencia: use el método de cadena zfill () (relleno cero) y realice operaciones como cadenas para construir una cadena de dígitos y solo convertir a int después de que se haya construido el número entero (tenga en cuenta que cuando se convierte a int ceros iniciales del primer número se perderán ya que un int no tiene ceros iniciales, eso está bien )

Básicamente, eliminamos los puntos de la cadena ip, formateamos la cadena para que tenga 12 caracteres y luego la convertimos en int.

Por ejemplo: 0.0.0.0 debería ir a -> 000.000.000.000 102.1.2.0 debería ir a -> 102001002000

Esto es lo que se me ocurrió, pero no parece funcionar:

def ip_to_int(ip):
ip = ip.split('.')
ip = ip[0].__str__() + ip[1].__str__() + ip[2].__str__() + ip[3].__str__()
ip = ip.zfill(12)
return int(ip)

Por ejemplo, cuando conecto la ip 0.0.0.0 en este código, devuelve el int 0. Y cuando pongo 1.0.0.0, resulta en 1,000. No puedo determinar por qué sucede esto.

Como dije, soy nuevo en Python, por lo que algo de lo que hice podría no tener sentido.

Gracias de antemano.

0
andrewDev15 30 oct. 2017 a las 03:56

5 respuestas

La mejor respuesta

Lo que el profesor pregunta sobre el zfill es hacer esto:

ip =  ip[0].__str__().zfill(3) 
    + ip[1].__str__().zfill(3) 
    + ip[2].__str__().zfill(3) 
    + ip[3].__str__().zfill(3)

Pero tenga en cuenta que su lista ya contiene cadenas, por lo que no necesita convertirlas nuevamente, entonces su código sería:

ip =   ip[0].zfill(3) 
     + ip[1].zfill(3) 
     + ip[2].zfill(3) 
     + ip[3].zfill(3)

Y para hacerlo aún más elegante y pitónico, podrías hacer:

ip = ''.join([i.zfill(3) for i in ip])
4
cs95 30 oct. 2017 a las 01:12
def ip_to_int(ip):
    return int("".join([n.zfill(3) for n in ip.split('.')]))

La explicación:

Primero dividimos la cadena ip en partes:

     ip.split('.')

Luego creamos una lista, rellenando cada parte con la cadena de la longitud 3:

     [n.zfill(3) for n in ip.split('.')]

Luego los unimos ("".join()) y convertimos la cadena resultante en un entero (int()).

1
MarianD 30 oct. 2017 a las 01:19

De la forma en que actualmente está resolviendo el problema, toma su cadena "102.1.2.0", luego la divide en una matriz ["102", "1","2","0"], luego junta la cadena "102120" y luego rellena con ceros. 000000102120. ¿Ves la respuesta ahora?

Intente resolverlo usted mismo primero, luego vea si esta es la respuesta que se le ocurrió.

Necesita zfill(3) cada cadena antes de juntarlas. Puede escribir esto completamente, str(ip[0]).zfill(3) + str(ip[1]).zfill(3) + ..., pero es una mejor práctica de codificación usar un bucle for si su profesor ya los ha revisado. Prueba for i in range(4): result = result + str(ip).zfill(3)

1
Danny Rivers 30 oct. 2017 a las 01:14

Es tarde pero:

def ip_to_int(ip):
    m = ''
    for i in ip.split('.'):
        m += (3-len(i))*'0' + i
    return int(m)
1
SP SP 30 oct. 2017 a las 01:30

Puedes probar esto:

int(''.join([i.zfill(3) for i in ip.split(".")]))
0
Huu-Danh Pham 30 oct. 2017 a las 01:09