返回元组键和值的列表

时间:2011-03-15 12:36:51

标签: python list tuples

我可以理解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提取到valueslstB元组列表中的lstA

('a', 'b', 'c')lstB('x', 'y', 'z')lstA

我的疑问是这样的:为什么lstBa元组而不是列表? bcx是同质的,yzlstA, lstB = zip(*lstTupA)也是同质的。将它们分组为元组是不合逻辑的,是吗?

理想情况下,['a', 'b', 'c']应该已将lstA分配给['x', 'y', 'z'],将lstB分配给{{1}}(列表)吗?

有人请澄清!

感谢。

6 个答案:

答案 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)

*lstTupAlstA, lstB = zip(*lstTupA)(或通常是*运算符)中做什么来展平迭代。因此,zip(*lstTupA)等于zip(lstTupA[0], lstTupA[1], ...)并且这些项目是传递给zip的元组,这正是lstAlstB是元组的原因。

答案 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')]。通过执行lstAlstB的分配,您只需从列表中提取元组。

答案 5 :(得分:0)

是的,你必须做一些愚蠢的事情,比如

[list(t) for t in zip(*lst)]

获取清单。

'pythonistas'急于捍卫大脑死亡选择的元组列表无法记住的是,元组无法分配。这使得zip(*m) 无用用于矩阵或之后您想要更改项目的任何其他内容。