PythonのZipリスト


151

リストを「圧縮」する方法を学習しようとしています。このために、私は特定の時点で次のことを行うプログラムを持っています。

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

これは、私の3つのリストを与えx1x2、およびx3、たとえば、サイズ20の各。

今私がやります:

zipall = zip(x1, x2, x3)

しかし、私がするとき:

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

20になりましたが、これは期待したものではありません。3つ期待してました。私は根本的に間違っていることをしていると思います。


4
正確には何を期待しzipていますか?なぜ3つのリストが必要なのですか-それらはどのように見えますか?
Daniel Roseman

zipはタプルのリストを返します。
デモ

回答:


225

あなたの場合はzip()20個の要素それぞれを含む一緒に3つのリストは、結果は20個の要素を持っています。各要素は3タプルです。

自分で見て:

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)]

各タプルに含まれる要素の数を確認するには、最初の要素の長さを調べます。

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

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

もちろん、リストが最初から空だった場合、これは機能しません。


1
len(result [0])は機能しません。'zip'オブジェクトは下付きではありません
GilbertS

2
Python 2の@GilbertSがzipリストを返しました。Python 3では、これはイテレータです
Tomerikoo


36

Python 2.7では、これは正常に機能した可能性があります。

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

しかし、Python 3.4では(そうでなければ、結果はのようなものになります<zip object at 0x00000256124E7DC8>):

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

28

zip 反復可能な引数からの要素を含むタプルで満たされた新しいリストを作成します。

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

私があなたがしようとしているのは、各要素がリストであるタプルを作成することです。


14

出典:私のブログ投稿(より良いフォーマット)

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

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

入力

ゼロ以上のイテラブル[1](例:リスト、文字列、タプル、辞書)

出力(リスト)

最初のタプル=(数字のelement_1、文字のelement_1)

2番目のタプル=(e_2数字、e_2文字)

n番目のタプル=(e_n数字、e_n文字)

  1. nタプルのリスト:nは最短の引数(入力)の長さ
    • len(numbers)== 3 <len(letters)== 4→short = 3→3タプルを返す
  2. 各タプルの長さ=引数の数(タプルは各引数から要素を取得します)
    • args =(numbers、letters); len(args)== 2→2つの要素を持つタプル
  3. ith tuple =(element_i arg1、element_i arg2…、element_i arg n

エッジケース

1)空の文字列:len(str)= 0 =タプルなし

2)単一の文字列:len(str)== len(args)== 1要素の2タプル

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

Zip in Action!

1. 2つのリストから辞書[2]を作成する

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 エレガントで明確、かつ簡潔なソリューションです

2.テーブルの列を印刷する

「*」[3]は「開梱」と呼ばれます。 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')

追加クレジット:解凍

zip(*args) の逆の効果があるため、「解凍」と呼ばれます 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 =各圧縮されたタプルのe1。tuple_2 =それぞれのe2zipped

脚注

  1. メンバーを1つずつ返すことができるオブジェクト(例:リスト[1,2,3]、文字列 'I like codin'、タプル(1,2,3)、辞書{'a':1、 'b' :2})
  2. {key1:value1、key2:value2 ...}
  3. 「開梱」(*)

* コード:

# 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

*numbers(1引数)を取り、その2つの要素を2つの引数に「アンパック」しました


14

基本的に、zip関数はPythonのリスト、タプル、および辞書で機能します。IPythonを使用している場合は、単にzipと入力しますか?そして、zip()が何であるかを確認してください。

IPythonを使用していない場合は、「pip install ipython」をインストールしてください。

リストの場合

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

出力は [('a', 'p'), ('b', 'q'), ('c', 'r')

辞書の場合:

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

出力は次のとおりです。

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

1
zip(c、d)はzip(list(c)、list(d))を実行しています
Stephen Woodbridge 2017年

13

Pythonの3 zipの代わりに返すイテレータやニーズはzip形式のタプルを取得するには、リストの関数に渡されます。

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

次に、unzipそれらに戻るには、圧縮されたイテレータを活用します。

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

タプルの代わりにリストの元の形式が必要な場合:

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

1
質問タグはPython 2.7を示しています。これはPython 3用です。さらに、この回答はすでにこれについて言及しています。
0 0

8

完全を期すために。

圧縮リストの長さが等しくない場合。結果リストの長さは、エラーが発生せずに最短のものになります

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

1

zipリストを返すとは思いません。zipジェネレータを返します。list(zip(a, b))タプルのリストを取得する必要があります。

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

1
質問タグはPython 2.7を示しています。これはPython 3用です。さらに、この回答はすでにこれについて言及しています。
0 0

1

これはzipで非常に高いランクの質問であるため、ここに追加する価値があります。zip素晴らしく、慣用的なPythonですが、大きなリストの場合、まったくスケーリングしません。

の代わりに:

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

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

を使用しizipます。最新の処理では、L1キャッシュメモリに格納され、大規模なリストのパフォーマンスが大幅に向上します。を追加するのと同じように使用しますi

for book, word in izip(books, words):
   print('{}: {}'.format(book, word))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.