Recientemente me encontré con este comportamiento en Python por accidente. ¿Podría alguien explicar por qué recorrer las listas list of lists y las listas separadas por comas dan como resultado el mismo resultado?

# comma separated lists
values = ['cat','fish'], ['cat','fish','monkey'], ['cat','fish','monkey','fish']
for v in values:
    print(v)

# List of lists
values = [['cat','fish'], ['cat','fish','monkey'], ['cat','fish','monkey','fish']]
for v in values:
    print(v)
2
Sudheesh Singanamalla 16 feb. 2017 a las 15:04

4 respuestas

La mejor respuesta

Si tiene valores separados por comas, Python interpreta esto como una tupla . Entonces su primera declaración es equivalente a:

values = (['cat','fish'], ['cat','fish','monkey'], ['cat','fish','monkey','fish'])

Al igual que una lista, una tupla es iterable sobre sus elementos (que son nuevamente ['cat','fish'], etc.)

Entonces, para v en el bucle for, nada cambia.

La única diferencia es que una tupla es inmutable , por lo que no puede agregar / eliminar elementos al primer values, ni puede establecer los elementos de values (sin embargo, puede realizar llamadas en las listas individuales).

10
Willem Van Onsem 16 feb. 2017 a las 12:07

El primero es tratado como una tupla y el segundo es la lista. Ambos son iterables para el bucle.

    # comma separated lists
    values = ['cat','fish'], ['cat','fish','monkey'],['cat','fish','monkey','fish']
    print(type(values))
    # Output will be <type 'tuple'>

    # List of lists
    values = [['cat','fish'], ['cat','fish','monkey'], `enter code here`['cat','fish','monkey','fish']]
     print(type(values))
    # Output will be <type 'list'>
0
Sudhanshu Dev 16 feb. 2017 a las 12:19

Básicamente, al separar las listas por comas, está creando una tupla, que se puede iterar:

values = ['cat','fish'], ['cat','fish','monkey'], ['cat','fish','monkey','fish']
values
(['cat','fish'], ['cat','fish','monkey'], ['cat','fish','monkey','fish'])
4
Netwave 16 feb. 2017 a las 12:08

Las listas separadas por comas es, de hecho, una tupla:

>>> values = ['cat','fish'], ['cat','fish','monkey'], ['cat','fish','monkey','fish']
>>> values
(['cat', 'fish'], ['cat', 'fish', 'monkey'], ['cat', 'fish', 'monkey', 'fish'])
>>> type(values)
<type 'tuple'>

Como las tuplas son iterables, obtienes el mismo resultado.

6
fredtantini 16 feb. 2017 a las 12:07