Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 返回元组列表';s键和值_Python_List_Tuples - Fatal编程技术网

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)]