Python'daki posta listeleri


151

Nasıl "zip" listeleri öğrenmeye çalışıyorum. Bu amaçla, belirli bir noktada aşağıdakileri yaptığım bir programım var:

x1, x2, x3 = stuff.calculations(withdataa)

Bu bana üç listeleri verir x1, x2ve x3, her say, boyut 20.

Şimdi yapıyorum:

zipall = zip(x1, x2, x3)

Ancak, ne zaman:

print "len of zipall %s" % len(zipall)

20 elde ederim, beklediğim bu değil. Üç tane bekliyordum. Sanırım temelde yanlış bir şey yapıyorum.


4
Tam olarak ne yapmayı umuyorsun zip? Neden üç listeniz olsun - neye benziyorlar?
Daniel Roseman

zip, tuples listesini döndürür.
Demo

Yanıtlar:


225

Her zip()biri 20 öğe içeren üç listeyi bir araya getirdiğinizde, sonuçta yirmi öğe bulunur. Her eleman üç parçalıdır.

Kendin için gör:

In [1]: a = b = c = range(20)

In [2]: zip(a, b, c)
Out[2]: 
[(0, 0, 0),
 (1, 1, 1),
 ...
 (17, 17, 17),
 (18, 18, 18),
 (19, 19, 19)]

Her parçanın kaç öğe içerdiğini bulmak için ilk öğenin uzunluğunu inceleyebilirsiniz:

In [3]: result = zip(a, b, c)

In [4]: len(result[0])
Out[4]: 3

Tabii ki, listeler başlamak için boş olsaydı bu işe yaramaz.


1
len (sonuç [0]) çalışmaz. 'zip' nesnesi abone edilemez
GilbertS

2
Python 2'deki @GilbertS zipbir liste döndürdü. Python 3'te bir yineleyici
Tomerikoo


36

Python 2.7'de bu işe yaramış olabilir:

>>> a = b = c = range(20)
>>> zip(a, b, c)

Ancak Python 3.4'te olması gerekir (aksi takdirde sonuç şöyle bir şey olacaktır <zip object at 0x00000256124E7DC8>):

>>> a = b = c = range(20)
>>> list(zip(a, b, c))

28

zip yinelenebilir bağımsız değişkenlerden öğeler içeren tupleslerle dolu yeni bir liste oluşturur:

>>> zip ([1,2],[3,4])
[(1,3), (2,4)]

Ben denemek için ne her öğe bir liste olduğu bir demet oluşturmak olduğunu bekliyoruz.


14

Kaynak: Blog Yazılarım (daha iyi biçimlendirme)

Misal

numbers = [1,2,3]
letters = 'abcd'

zip(numbers, letters)
# [(1, 'a'), (2, 'b'), (3, 'c')]

Giriş

Sıfır veya daha fazla yinelenebilir [1] (ör. Liste, dize, grup, sözlük)

Çıktı (liste)

1. grup = (sayıların element_1, harflerin element_1)

2. grup = (e_2 sayı, e_2 harf)

...

n. üçlü = (e_n sayıları, e_n harfleri)

  1. N tuples listesi: n en kısa argümanın uzunluğudur (girdi)
    • len (sayılar) == 3 <len (harfler) == 4 → kısa = 3 → 3 tuple döndür
  2. Her tuple uzunluğu = bağımsız değişken sayısı (tuple her argümandan bir eleman alır)
    • args = (sayılar, harfler); len (args) == 2 → 2 elemanlı demet
  3. ith tuple = (element_i arg1, element_i arg2…, element_i arg n)

Kenar Kılıfları

1) Boş Dize: len (str) = 0 = tuples yok

2) Tek Dize: len (str) == len (args) == 1 öğe içeren 2 tuple

zip()
# []
zip('')
# []
zip('hi')
# [('h',), ('i',)]

Eylem Zip!

1. İki listeden bir sözlük [2] oluşturun

keys = ["drink","band","food"]
values = ["La Croix", "Daft Punk", "Sushi"]

my_favorite = dict( zip(keys, values) )

my_favorite["drink"]
# 'La Croix'

my_faves = dict()
for i in range(len(keys)):
    my_faves[keys[i]] = values[i]
  • zip zarif, açık ve özlü bir çözümdür

2. Tablodaki sütunları yazdırma

"*" [3] "ambalajdan çıkarma" olarak adlandırılır: f(*[arg1,arg2,arg3]) == f(arg1, arg2, arg3)

student_grades = [
[   'Morty'  ,  1   ,  "B"  ],
[   'Rick'   ,  4   ,  "A"  ],
[   'Jerry'  ,  3   ,  "M"  ],
[  'Kramer'  ,  0   ,  "F"  ],
]

row_1 = student_grades[0]
print row_1
# ['Morty', 1, 'B']

columns = zip(*student_grades)
names = columns[0]
print names
# ('Morty', 'Rick', 'Jerry', 'Kramer')

Ekstra Kredi: Unzipping

zip(*args) "unzipping" olarak adlandırılır, çünkü bunun ters etkisi vardır. zip

numbers = (1,2,3)
letters = ('a','b','c')

zipped = zip(numbers, letters)
print zipped
# [(1, 'a'), (2, 'b'), (3, 'c')]

unzipped = zip(*zipped)
print unzipped
# [(1, 2, 3), ('a', 'b', 'c')]
  • unzipped: tuple_1 = sıkıştırılmış her bir tuplein e1'i. tuple_2 = her birinin e2zipped

Dipnotlar

  1. Üyelerini teker teker döndürebilen bir nesne (ör. Liste [1,2,3], 'I codin'i seviyorum', tuple (1,2,3), sözlük {'a': 1, 'b' : 2})
  2. {anahtar1: değer1, anahtar2: değer2 ...}
  3. “Paketten Çıkarma” (*)

* Kod:

# foo - function, returns sum of two arguments
def foo(x,y):
    return x + y
print foo(3,4)
# 7

numbers = [1,2]
print foo(numbers)
# TypeError: foo() takes exactly 2 arguments (1 given)

print foo(*numbers)
# 3

*numbers2 elementini 2 argümana "(1 arg) aldı ve" paketini açtı "


14

Temel olarak zip işlevi Python'daki listelerde, tuples ve sözlüklerde çalışır. IPython kullanıyorsanız sadece zip? Ve zip () 'in ne olduğunu kontrol edin.

IPython kullanmıyorsanız, sadece kurun: "pip install ipython"

Listeler için

a = ['a', 'b', 'c']
b = ['p', 'q', 'r']
zip(a, b)

Çıktı [('a', 'p'), ('b', 'q'), ('c', 'r')

Sözlük için:

c = {'gaurav':'waghs', 'nilesh':'kashid', 'ramesh':'sawant', 'anu':'raje'}
d = {'amit':'wagh', 'swapnil':'dalavi', 'anish':'mane', 'raghu':'rokda'}
zip(c, d)

Çıktı:

[('gaurav', 'amit'),
 ('nilesh', 'swapnil'),
 ('ramesh', 'anish'),
 ('anu', 'raghu')]

1
zip (c, d) zip yapıyor (liste (c), liste (d))
Stephen Woodbridge

13

In Python 3 zip döner bir yineleyici yerine ve ihtiyaçları sıkıştırılmış dizilerini almak için bir liste işlevine geçirilecek:

x = [1, 2, 3]; y = ['a','b','c']
z = zip(x, y)
z = list(z)
print(z)
>>> [(1, 'a'), (2, 'b'), (3, 'c')]

Sonra unziponlara geri sadece sıkıştırılmış yineleyici konjuge:

x_back, y_back = zip(*z)
print(x_back); print(y_back)
>>> (1, 2, 3)
>>> ('a', 'b', 'c')

Tuples yerine orijinal liste formu gerekiyorsa:

x_back, y_back = zip(*z)
print(list(x_back)); print(list(y_back))
>>> [1,2,3]
>>> ['a','b','c']

1
Soru etiketi Python 2.7'yi belirtir; Bu Python 3 içindir. Ayrıca, bu cevap zaten bundan bahsediyor.
0 0

8

Bütünlük uğruna.

Sıkıştırılmış listelerin uzunlukları eşit olmadığında. Sonuç listesinin uzunluğu, herhangi bir hata oluşmadan en kısa olacak

>>> a = [1]
>>> b = ["2", 3]
>>> zip(a,b)
[(1, '2')]

1

zipBir liste döndürdüğünü sanmıyorum . zipbir jeneratör döndürür. Bir list(zip(a, b))tuples listesi almak için yapmanız gerekiyor.

x = [1, 2, 3]
y = [4, 5, 6]
zipped = zip(x, y)
list(zipped)

1
Soru etiketi Python 2.7'yi belirtir; Bu Python 3 içindir. Ayrıca, bu cevap zaten bundan bahsediyor.
0 0

1

Zip üzerinde bu kadar üst düzey bir soru olduğu için buraya eklemeye değer. zipharika, deyimsel Python - ancak büyük listeler için hiç de iyi ölçeklenmiyor.

Onun yerine:

books = ['AAAAAAA', 'BAAAAAAA', ... , 'ZZZZZZZ']
words = [345, 567, ... , 672]

for book, word in zip(books, words):
   print('{}: {}'.format(book, word))

Kullanın izip. Modern işleme için, L1 Önbellekte saklar ve daha büyük listeler için çok daha performanslıdır. Bunu aşağıdakileri eklemek kadar basit kullanın i:

for book, word in izip(books, words):
   print('{}: {}'.format(book, word))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.