在Python中的Zip列表
我正试图学习如何“拉链”名单。 为此,我有一个程序,在某个特定点上,我做了以下工作:
x1, x2, x3 = stuff.calculations(withdataa)
这给了我三个列表, x1
, x2
和x3
,每个都是,大小为20。
现在,我做了:
zipall = zip(x1, x2, x3)
但是,当我这样做的时候:
print "len of zipall %s" % len(zipall)
我得到20,这不是我所期望的。 我预计三点。 我想我正在做一些根本性的错误。
当你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)]
要找出每个元组包含多less个元素,可以检查第一个元素的长度:
In [3]: result = zip(a, b, c) In [4]: len(result[0]) Out[4]: 3
当然,如果列表是空的,这将不起作用。
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...
并将它们“拉”到一个列表中,其条目是三元组(ai, bi, ci)
。 想象一下从左到右水平拉链拉链。
zip
创build一个新的列表,用包含来自可迭代参数的元素的元组填充:
>>> zip ([1,2],[3,4]) [(1,3), (2,4)]
我期望你试着去创build一个元组,其中每个元素都是一个列表。
在Python 2.7中,这可能工作得很好。
>>> a=b=c=range(20) >>> zip(a,b,c)
但在Python 3.4中
>>> a=b=c=range(20) >>> list(zip(a,b,c))
基本上zip函数在Python中的列表,元组和dictonary上工作。 如果你使用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)
输出是
[('nilesh', 'amit'), ('ramesh', 'raghu'), ('gaurav', 'anish'), ('anu', 'swapnil')]
为了完整起见。
当压缩列表的长度不相等时。 结果列表的长度将成为最短的一个没有发生任何错误
>>> 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')]
input
零或多个迭代[1](例如列表,string,元组,字典)
输出 (列表)
第一个元组= =(数字的元素_1,字母的元素_1)
第二个元组=((e_2个数字,e_2个字母)
…
第n个元组=(e_n个数字,e_n个字母)
- n个元组列表:n是最短参数的长度(input)
- len(数字)== 3 <len(字母)== 4→short = 3→返回3个元组
- 每个元组的长度= args的数量(元组从每个arg中取一个元素)
- args =(数字,字母); len(args)== 2→具有2个元素的元组
- 第
i
个元组=((element_i arg1,element_i arg2 …,element_i argn
)
边缘情况
1)空string:len(str)= 0 =没有元组
2)单个string:len(str)== 2元组len(args)== 1个元素(s)
zip() # [] zip('') # [] zip('hi') # [('h',), ('i',)]
邮编在行动!
1.从两个列表中build立一个字典[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
是一个优雅,清晰,简洁的解决scheme
2.在表格中打印列
f(*[arg1,arg2,arg3]) == f(arg1, arg2, arg3)
“*”[3]被称为“解包”
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 = e2的每个zipped
脚注
- 一个能够一次返回其成员的对象(例如,list [1,2,3],string'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
*
把numbers
(1 arg)和“解开”其2个元素分成2个参数