Python中的邮政编码列表


151

我正在尝试学习如何“压缩”列表。为此,我有一个程序,在某个特定位置执行以下操作:

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

这给了我三个列表,x1x2,和x3,每一个,比方说,大小为20。

现在,我这样做:

zipall = zip(x1, x2, x3)

但是,当我这样做时:

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

我得到20,这不是我期望的。我预计三个。我认为我做的事情根本上是错误的。


4
您究竟zip打算做什么?为什么要有三个列表-它们的外观如何?
丹尼尔·罗斯曼

zip返回一个元组列表。
演示

Answers:


225

zip()三个包含20个元素的列表放在一起时,结果将包含20个元素。每个元素都是一个三元组。

你自己看:

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)

第二个元组=(e_2个数字,e_2个字母)

第n个元组=(e_n个数字,e_n个字母)

  1. n个元组的列表:n是最短参数(输入)的长度
    • len(数字)== 3 <len(字母)== 4→短= 3→返回3个元组
  2. 每个元组的长度= args的数量(元组从每个arg中获取一个元素)
    • args =(数字,字母); len(args)== 2→具有2个元素的元组
  3. i第元组=(element_i arg1,element_i arg2…,element_i arg n

边缘案例

1)空字符串:len(str)= 0 =无元组

2)单个字符串:len(str)== 2个元组,len(args)== 1个元素

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

压缩中!

1.从两个列表中构建字典[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。元组_2 =每个e2zipped

脚注

  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

13

Python 3中,它 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))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.