我可以理解zip()
函数用于构造这样的元组列表:
x = ['a', 'b', 'c']
y = ['x', 'y', 'z', 'l']
lstTupA = zip(x,y)
lstTupA
将是[('a', 'x'), ('b', 'y'), ('c', 'z')]
。
lstA, lstB = zip(*lstTupA)
上述操作会将元组列表中的keys
lstA
提取到values
和lstB
元组列表中的lstA
。
('a', 'b', 'c')
为lstB
而('x', 'y', 'z')
为lstA
。
我的疑问是这样的:为什么lstB
和a
元组而不是列表? b
,c
和x
是同质的,y
,z
和lstA, lstB = zip(*lstTupA)
也是同质的。将它们分组为元组是不合逻辑的,是吗?
理想情况下,['a', 'b', 'c']
应该已将lstA
分配给['x', 'y', 'z']
,将lstB
分配给{{1}}(列表)吗?
有人请澄清!
感谢。
答案 0 :(得分:5)
“将它们归类为元组是不合逻辑的,是吗?”
是。这是合乎逻辑的。
有两种内置序列。列表和元组。
zip()
函数具有 n 参数,用于定义要在 n 处修复的元组的基数。
只有当其他参数以某种方式,神奇地,附加或不附加到结果序列时,列表才是合适的。这将意味着可变长度的序列,而不是由zip()
的参数数量定义。通过单个函数调用构建这将是一个相当复杂的结构。
答案 1 :(得分:2)
zip
被简单地定义为以这种方式行事:
In [2]: help(zip)
Help on built-in function zip in module __builtin__:
zip(...)
zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]
--> Return a list of tuples <--, where each tuple contains the i-th element
from each of the argument sequences. The returned list is truncated
in length to the length of the shortest argument sequence.
答案 2 :(得分:2)
*lstTupA
在lstA, lstB = zip(*lstTupA)
(或通常是*
运算符)中做什么来展平迭代。因此,zip(*lstTupA)
等于zip(lstTupA[0], lstTupA[1], ...)
并且这些项目是传递给zip的元组,这正是lstA
和lstB
是元组的原因。
答案 3 :(得分:1)
zip
不知道等号左侧的内容。据他所知,lstTupA = zip(x,y)
和lstA, lstB = zip(*lstTupA)
是一回事。 zip
被定义为做一件事而且在做这件事时它是不变的。您决定在第二个语句中拆分元组列表,因此您就是在第二个语句中添加额外上下文的那个。
答案 4 :(得分:1)
理想情况下,lstA,lstB = zip(* lstTupA)应该将['a','b','c']分配给lstA,将['x','y','z']分配给lstB(列表)正确?
不,那不对。请记住,该zip会返回一个元组列表,这正是您所说的
时的行为方式lstTupA将是[('a','x'),('b','y'),('c','z')]。
那么,为什么在zip(*lstTupA)
的情况下它会返回不同的东西?它仍将返回元组列表,在本例中为[('a', 'b', 'c'), ('x', 'y', 'z')]
。通过执行lstA
和lstB
的分配,您只需从列表中提取元组。
答案 5 :(得分:0)
是的,你必须做一些愚蠢的事情,比如
[list(t) for t in zip(*lst)]
获取清单。
'pythonistas'急于捍卫大脑死亡选择的元组列表无法记住的是,元组无法分配。这使得zip(*m)
无用用于矩阵或之后您想要更改项目的任何其他内容。