在Python中的Zip列表

我正试图学习如何“拉链”名单。 为此,我有一个程序,在某个特定点上,我做了以下工作:

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

这给了我三个列表, x1x2x3 ,每个都是,大小为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个字母)

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

边缘情况

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

脚注

  1. 一个能够一次返回其成员的对象(例如,list [1,2,3],string'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 arg)和“解开”其2个元素分成2个参数