una tuplas que metodos llenar listas lista elementos diccionarios conjuntos anidadas agregar python tuples iterable-unpacking

tuplas - metodos de listas en python



Desempaquetado de tuplas extendidas en Python 2 (3)

¿Es posible simular el desempaquetado de tuplas extendidas en Python 2?

Específicamente, tengo un bucle for:

for a, b, c in mylist:

que funciona bien cuando mylist es una lista de tuplas de tamaño tres. Quiero que el mismo ciclo funcione si paso una lista del tamaño cuatro.

Creo que terminaré usando tuplas con nombre, pero me preguntaba si hay una manera fácil de escribir:

for a, b, c, *d in mylist:

Así que d come cualquier miembro extra.


No puedes hacer eso directamente, pero no es terriblemente difícil escribir una función de utilidad para hacer esto:

>>> def unpack_list(a, b, c, *d): ... return a, b, c, d ... >>> unpack_list(*range(100)) (0, 1, 2, (3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99))

Podrías aplicarlo a tu bucle for así:

for sub_list in mylist: a, b, c, d = unpack_list(*sub_list)


Podría definir una función de envoltorio que convierte su lista en una tupla de cuatro. Por ejemplo:

def wrapper(thelist): for item in thelist: yield(item[0], item[1], item[2], item[3:]) mylist = [(1,2,3,4), (5,6,7,8)] for a, b, c, d in wrapper(mylist): print a, b, c, d

El código se imprime:

1 2 3 (4,) 5 6 7 (8,)


Por el gusto de hacerlo, generalizado para descomprimir cualquier número de elementos:

lst = [(1, 2, 3, 4, 5), (6, 7, 8), (9, 10, 11, 12)] def unpack(seq, n=2): for row in seq: yield [e for e in row[:n]] + [row[n:]] for a, rest in unpack(lst, 1): pass for a, b, rest in unpack(lst, 2): pass for a, b, c, rest in unpack(lst, 3): pass