179

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

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

x1これにより、、、、x2およびの3つのリストが得られますx3。それぞれ、たとえばサイズ20です。

今私がやります:

zipall = zip(x1, x2, x3)

しかし、私がそうするとき:

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

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

4

10 に答える 10

259

それぞれ20個の要素を含む3つのリストをzip()まとめると、結果には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

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

于 2012-12-04T14:15:11.510 に答える
72

zip好きなリストの束を取ります

a: a1 a2 a3 a4 a5 a6 a7...
b: b1 b2 b3 b4 b5 b6 b7...
c: c1 c2 c3 c4 c5 c6 c7...

そして、それらを3タプルのエントリを持つ1つのリストに「圧縮」します(ai, bi, ci)。ジッパーを左から右に水平に描くことを想像してみてください。

于 2012-12-04T14:18:25.857 に答える
43

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))
于 2015-05-01T00:37:23.347 に答える
29

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

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

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

于 2012-12-04T14:17:12.327 に答える
20

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、zip形式のイテレータを活用します。

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']
于 2018-05-27T14:17:29.900 に答える
14

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

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

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

入力

0個以上の反復可能オブジェクト[1](リスト、文字列、タプル、辞書など)

出力(リスト)

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 =(数値、文字); len(args)==2→2つの要素を持つタプル
  3. ithタプル=(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=各zipタプルの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

*(1 arg)を取りnumbers、その2つの要素を2つのargに「解凍」しました

于 2017-05-25T17:37:19.850 に答える
13

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

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

リストの場合

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')]
于 2014-07-19T19:17:55.253 に答える
8

完全を期すために。

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

>>> a = [1]
>>> b = ["2", 3]
>>> zip(a,b)
[(1, '2')]
于 2016-11-20T21:52:56.507 に答える
5

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))
于 2020-02-23T13:57:22.767 に答える
1

zip私はリストを返すとは思わない。zipジェネレータを返します。list(zip(a, b))タプルのリストを取得するために行う必要があります。

x = [1, 2, 3]
y = [4, 5, 6]
zipped = zip(x, y)
list(zipped)
于 2018-05-08T15:23:18.463 に答える