Python中的Zip列表
我正在努力学习如何“压缩”列表。为此,我有一个程序,在特定点上,我执行以下操作:Python中的Zip列表,python,python-2.7,Python,Python 2.7,我正在努力学习如何“压缩”列表。为此,我有一个程序,在特定点上,我执行以下操作: x1, x2, x3 = stuff.calculations(withdataa) 这给了我三个列表,x1、x2和x3,每个都是20号 现在,我要: zipall = zip(x1, x2, x3) 然而,当我这样做时: print "len of zipall %s" % len(zipall) 我得到20分,这不是我所期望的。我以为是三个。我认为我做了一些根本错误的事情。当你把三个列表(每个列表包含20
x1, x2, x3 = stuff.calculations(withdataa)
这给了我三个列表,x1
、x2
和x3
,每个都是20号
现在,我要:
zipall = zip(x1, x2, x3)
然而,当我这样做时:
print "len of zipall %s" % len(zipall)
我得到20分,这不是我所期望的。我以为是三个。我认为我做了一些根本错误的事情。当你把三个列表(每个列表包含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
当然,如果列表一开始是空的,这将不起作用。
zip
创建一个新列表,用元组填充,元组包含iterable参数中的元素:
>>> zip ([1,2],[3,4])
[(1,3), (2,4)]
我希望您尝试创建一个元组,其中每个元素都是一个列表。
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元组
(ai、bi、ci)
。想象一下,从左到右水平地画一个拉链。基本上,在Python中,zip函数适用于列表、元组和字典。
如果您使用的是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')]
在Python 2.7中,这可能工作得很好:
>>> a = b = c = range(20)
>>> zip(a, b, c)
但在Python3.4中应该是这样的(否则,结果将类似于
):
为了完整起见 当压缩列表的长度不相等时。 结果列表的长度将变为最短,不会发生任何错误
>>> a = [1]
>>> b = ["2", 3]
>>> zip(a,b)
[(1, '2')]
资料来源:
示例
numbers = [1,2,3]
letters = 'abcd'
zip(numbers, letters)
# [(1, 'a'), (2, 'b'), (3, 'c')]
输入
零个或多个iterables[1](例如列表、字符串、元组、字典)
输出(列表)
第一个元组=(数字元素_1,字母元素_1)
第二元组=(e_2个数字,e_2个字母)
第n个元组=(e_n个数字,e_n个字母)
- len(数字)==3
- args=(数字、字母);len(args)==2→ 具有2个元素的元组
i
th元组=(元素i arg1,元素i arg2…,元素i argn
)动作中的拉链! 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
numbers = [1,2,3]
letters = 'abcd'
zip(numbers, letters)
# [(1, 'a'), (2, 'b'), (3, 'c')]
“*”[3]称为“解包”:f(*[arg1,arg2,arg3])==f(arg1,arg2,arg3)
额外积分:解压
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')]
unzip
:每个压缩元组的元组_1=e1。每个压缩的元组的元组_2=e2
脚注
一个能够一次返回一个成员的对象(例如列表[1,2,3],字符串'I like codin',元组(1,2,3),字典{'a':1,'b':2})
{key1:value1,key2:value2…}
“拆包”(*)
*
代码:
# 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个参数)并将其2个元素“解包”为2个参数我认为zip
不会返回一个列表。zip
返回一个生成器。要获得元组列表,必须执行list(zip(a,b))
x = [1, 2, 3]
y = [4, 5, 6]
zipped = zip(x, y)
list(zipped)
在Python 3zip
中,返回一个迭代器,需要传递给列表函数以获取压缩元组:
x = [1, 2, 3]; y = ['a','b','c']
z = zip(x, y)
z = list(z)
print(z)
>>> [(1, 'a'), (2, 'b'), (3, 'c')]
然后,要将它们解压缩回来,只需共轭压缩迭代器即可:
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']
这里值得添加,因为这是一个关于zip的排名很高的问题。zip
是很棒的、惯用的Python,但对于大型列表,它的伸缩性并不好
而不是:
books = ['AAAAAAA', 'BAAAAAAA', ... , 'ZZZZZZZ']
words = [345, 567, ... , 672]
for book, word in zip(books, words):
print('{}: {}'.format(book, word))
使用izip
。对于现代处理,它将其存储在一级缓存内存中,对于更大的列表性能更高。使用它就像添加i
一样简单:
for book, word in izip(books, words):
print('{}: {}'.format(book, word))
您希望zip
做什么?为什么要有三个列表?它们看起来像什么?zip返回一个元组列表。zip(c,d)正在执行zip(list(c),list(d))@Sigur:问号表示Python2.7;这是Python3。此外,已经提到了这一点。问号表示Python2.7;这是Python3。此外,已经提到了这一点。len(结果[0])无法工作。“zip”对象不可用subscriptable@GilbertS在Python2zip
中返回了一个列表。在Python3中,它是一个iterator@GilbertS在Python3中,使用list(zip(a,b,c))
获得Python2的行为。
books = ['AAAAAAA', 'BAAAAAAA', ... , 'ZZZZZZZ']
words = [345, 567, ... , 672]
for book, word in zip(books, words):
print('{}: {}'.format(book, word))
for book, word in izip(books, words):
print('{}: {}'.format(book, word))