Soy novata en python y obtuve este código:

nlist = autoscaling_connection.get_all_launch_configurations()
name = "CONFIG"    
versions = [x.name[len(name):] for x in nlist
                if (x.name.startswith(name) and is_number(x.name[len(name):]))]

Entiendo que el bucle for se concatena en la lista de versiones, pero no entiendo la asignación:

[x.name[len(name):]
1
Alex 15 sep. 2018 a las 23:42

3 respuestas

La mejor respuesta

Expandiré todo el código, luego lo revisaré

versions = [x.name[len(name):] for x in nlist
            if (x.name.startswith(name) and is_number(x.name[len(name):]))]

Es equivalente a

versions = []
for x in nlist:
    if (x.name.startswith(name) and is_number(x.name[len(name):])):
         versions.append(x.name[len(name):])

En cuanto a qué

x.name[len(name):]

Significa, significa tomar de x.name, los caracteres que comienzan en el índice que es igual a len(name) (la longitud del nombre), hasta el final de x.name

Así que en un ejemplo más simple, digamos que tengo una lista

my_list = [1, 2, 3, 4, 5]

Y yo hago

my_list[2:]

Entonces esto volvería

[3, 4, 5]

Que es lo mismo que desde el 2º elemento hasta el final.

Espero que esto ayude. Si desea obtener más información sobre la notación de corte de python, puedo recomendar esta otra pregunta SO: Comprensión de la notación de corte de Python

3
dangee1705 15 sep. 2018 a las 20:47

En python si x es una lista y i es un índice (un entero).

x[i:] 

Significa "todos los elementos en x comenzando en el índice i hasta el final"

También puedes tener

x[i:j]

"todos los elementos en x comenzando en el índice i hasta el final, pero sin incluir j"

x[:j]

"todos los elementos en x comienzan desde el principio hasta el final, pero no incluyen j"

y = x[:]

"copiar todos los elementos de x en una nueva lista y asignarlo a y"

y = x[2:9:3]

"cada tercer elemento de x que comienza en el índice 2 y termina antes del índice 9".

Hay más que sugeriría buscar propiedades de lista en Python.

0
Michael Ekoka 15 sep. 2018 a las 21:02

Un código un poco más completo (pero estimado):

class K:
    """A class that has a name property"""
    def __init__(self,name):
        self.name = name

# a prefix to look for            
name = "Fiat "


# a list of objects that have a name - some starting with our name
nlist = [K("Fiat 2"), K("Fiat 4"), K("Fiat 2711999"), K("Fiat Dupe 09"), K("DosntFly 0815")]

def is_number(text):
    """Test if the text is an integer."""
    try:
        int(text.strip())
    except:
        return False
    return True


versions = [x.name[len(name):] for x in nlist
                if (x.name.startswith(name) and is_number(x.name[len(name):]))]

print(versions)

Salida:

['2', '4', '2711999']

¿por qué?

La lista de comprensión prueba cada elemento de nlist.

Solo dejará cosas en versions que satisfagan los if (x.name.startswith(name) and is_number(x.name[len(name):].

Significado: cada clase de instanse name tiene que comenzar con el contenido de la variable name y lo que venga después de tantos caracteres como name tenga, debe verificar como True si se alimenta a is_number().

Si esto encaja, está tomando la "parte numérica" y la agrega como elemento en la lista resultante.

"Fiat Dupe 09"  # not in the list, because "Dupe 09" is not True
"DosntFly 0815" # not in the list, because not starting with "Fiat "
0
Patrick Artner 15 sep. 2018 a las 21:07