Python 返回元组列表';s键和值
我可以理解Python 返回元组列表';s键和值,python,list,tuples,Python,List,Tuples,我可以理解zip()函数用于构造元组列表,如下所示: x = ['a', 'b', 'c'] y = ['x', 'y', 'z', 'l'] lstTupA = zip(x,y) lstupa将是[('a','x'),('b','y'),('c','z')] 上述操作将元组列表中的键提取到lstA,并将元组列表中的值提取到lstB lstA是('a','b','c'),lstB是('x','y','z') 我的问题是:为什么lstA和lstB是元组而不是列表a、b和c是同质的,x、y和z也是
zip()
函数用于构造元组列表,如下所示:
x = ['a', 'b', 'c']
y = ['x', 'y', 'z', 'l']
lstTupA = zip(x,y)
lstupa
将是[('a','x'),('b','y'),('c','z')]
上述操作将元组列表中的键
提取到lstA
,并将元组列表中的值
提取到lstB
lstA
是('a','b','c')
,lstB
是('x','y','z')
我的问题是:为什么lstA
和lstB
是元组而不是列表<代码>a、b
和c
是同质的,x
、y
和z
也是同质的。将它们分组为元组是不合乎逻辑的,是吗
理想情况下,lstA,lstB=zip(*lstupa)
应该将['a','b','c']
分配给lstA
和['x','y','z']
分配给lstB
(列表)对吗
有人请澄清
谢谢。
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]中的:帮助(zip)
关于内置函数zip-in模块的帮助\uuuu内置\uuuu:
zip(…)
邮政编码(seq1[,seq2[…])->[(seq1[0],seq2[0]…),(…)]
-->返回元组列表
“将它们分组为元组是不合乎逻辑的,是吗?”
对。这是合乎逻辑的
有两种内置序列。列表和元组
zip()
函数有n个参数,用于定义要固定在n的元组基数
只有当其他参数以某种方式神奇地附加到或不附加到结果序列中时,列表才是合适的。这意味着长度可变的序列,而不是由zip()
的参数数量定义的。用一个函数调用来构建这将是一个相当复杂的结构。在lstA中,lstB=zip(*lstTupA)
(或者通常是*
操作符)i将iterable展平。因此,执行zip(*lstupa)
等于zip(lstupa[0],lstupa[1],…)
,这些项是传递给zip的元组,这正是lstA
和lstB
是元组的原因。zip
不知道等号左边是什么。据它所知,lstTupA=zip(x,y)
和lstA,lstB=zip(*lstTupA)
是一回事zip
被定义为做一件事,并且在做这件事时是不变的。您已经决定在第二条语句中拆分元组列表,因此您是向第二条语句添加额外上下文的人
理想情况下,lstA,lstB=zip(*lstTupA)应该将['a','b','c']分配给lstA,并将['x','y','z']分配给lstB(列表),对吗
不,那是不对的。记住,zip返回一个元组列表,这正是您希望它的行为方式
lstupa应该是[('a','x'),('b','y'),('c','z')]
那么,为什么在zip(*lstupa)
的情况下它会返回不同的结果呢?它仍然会返回元组列表,在本例中是[('a','b','c'),('x','y','z')]
。通过对lstA
和lstB
执行赋值,您只需从列表中提取元组。是的,您必须做一些愚蠢的事情,如
[list(t) for t in zip(*lst)]
只是为了得到清单
那些急于为元组列表的死脑筋的选择辩护的“蟒蛇”们没有记住的是元组不能被分配给。这使得zip(*m)
对于矩阵或以后要更改项目的任何其他内容都没有用处。集合和字符串不是内置序列吗?@Space\u C0wb0y:set具有迭代器接口,但不是序列。它们不是按位置索引的。字符串虽然是序列,但似乎不太合适,可能不值得一提。“为什么元组返回函数会返回元组?”-有点奇怪的问题。我想你可能是需要澄清的人。zip
总是返回一个元组列表,没有什么意外的。执行lstA,lstB=zip(…)
只会吃掉外部列表,这称为序列解包。@MattH-是的,这是最终必须回答的问题!!
[list(t) for t in zip(*lst)]