Estou tentando aprender como "zipar" listas. Para esse fim, tenho um programa em que, em um determinado momento, faço o seguinte:
x1, x2, x3 = stuff.calculations(withdataa)
Isto dá-me três listas, x1
, x2
, e x3
, cada um, digamos, tamanho 20.
Agora eu faço:
zipall = zip(x1, x2, x3)
No entanto, quando eu faço:
print "len of zipall %s" % len(zipall)
Eu recebo 20, o que não é o que eu esperava. Eu esperava três. Eu acho que estou fazendo algo fundamentalmente errado.
python
python-2.7
AJW
fonte
fonte
zip
fazer? Por que você deveria ter três listas - como elas seriam?Respostas:
Quando você
zip()
reúne três listas contendo 20 elementos cada, o resultado possui vinte elementos. Cada elemento é uma três-tupla.Veja por si mesmo:
Para descobrir quantos elementos cada tupla contém, você pode examinar o comprimento do primeiro elemento:
Obviamente, isso não funcionará se as listas estiverem vazias para começar.
fonte
zip
retornou uma lista. No Python 3 é um iteradorzip
leva um monte de gostos de listase os "fecha" em uma lista cujas entradas são de três tuplas
(ai, bi, ci)
. Imagine desenhar um zíper horizontalmente da esquerda para a direita.fonte
No Python 2.7, isso pode ter funcionado bem:
Mas no Python 3.4 deveria ser (caso contrário, o resultado será algo como
<zip object at 0x00000256124E7DC8>
):fonte
zip
cria uma nova lista, preenchida com tuplas contendo elementos dos argumentos iteráveis:Espero que você tente criar uma tupla em que cada elemento seja uma lista.
fonte
Fonte: Minha postagem no blog (melhor formatação)
Exemplo
Entrada
Zero ou mais iteráveis [1] (por exemplo, lista, string, tupla, dicionário)
Saída (lista)
i
tupla = (elemento_i arg1, elemento_i arg2…, elemento_i argn
)Casos Edge
1) String vazia: len (str) = 0 = sem tuplas
2) String única: len (str) == 2 tuplas com len (args) == 1 elemento (s)
Zip em ação!
1. Crie um dicionário [2] de duas listas
zip
é uma solução elegante, clara e concisa2. Imprimir colunas em uma tabela
"*" [3] é chamado "desembalar":
f(*[arg1,arg2,arg3]) == f(arg1, arg2, arg3)
Crédito Extra: Descompactando
zip(*args)
é chamado de "descompactar" porque tem o efeito inverso dezip
unzipped
: tuple_1 = e1 de cada tupla compactada. tuple_2 = e2 de cadazipped
Notas de rodapé
*
Código:*
pegounumbers
(1 arg) e descompactou seus '2 elementos em 2 argsfonte
Basicamente, a função zip funciona em listas, tuplas e dicionários em Python. Se você estiver usando IPython, basta digitar zip? E verifique o que é o zip ().
Se você não estiver usando o IPython, basta instalá-lo: "pip install ipython"
Para listas
A saída é
[('a', 'p'), ('b', 'q'), ('c', 'r')
Para dicionário:
A saída é:
fonte
No Python 3,
zip
retorna um iterador e precisa ser passado para uma função de lista para obter as tuplas compactadas:Então, para
unzip
eles de volta, basta conjugar o iterador compactado:Se a forma original da lista for necessária em vez de tuplas:
fonte
Pelo bem da integridade.
Quando o comprimento das listas compactadas não é igual. O comprimento da lista de resultados se tornará o menor, sem que ocorra qualquer erro
fonte
Eu não acho que
zip
retorna uma lista.zip
retorna um gerador. Você precisa fazerlist(zip(a, b))
para obter uma lista de tuplas.fonte
Vale a pena adicionar aqui, pois é uma pergunta de alta classificação no zip.
zip
é ótimo, Python idiomático - mas não escala muito bem para grandes listas.Ao invés de:
Use
izip
. Para o processamento moderno, ele o armazena na memória L1 Cache e tem muito mais desempenho em listas maiores. Use-o simplesmente como adicionar umi
:fonte