Python列表重新排列

时间:2015-01-26 13:14:23

标签: python python-3.x

我目前正在尝试将代码的一部分从Python2移植到Python3,此代码中的一个函数返回表示表的元组列表,但是这些值是从多个tkinter listboxes这有两个步骤:

  1. 依次从每个列表框中获取完整列
  2. 将列表从每列的元组反转为每行元组
  3. Python2中执行此操作的行是:

    apply(map, [None] + result)
    

    我还没知道这实际上是如何工作的,或者如何移植它,我已经浏览了文档和我可以看到的关于如何移植到Python3申请或地图的一切并没有实现我想要的目标。

    我正在使用Python 3.3,因为列数不固定,所以首选灵活的答案。

    作为一个例子:

    [("c1r1","c1r2","c1r3"),("c2r1","c2r2","c2r3"),("c3r1","c3r2","c3r3")]
    

    需要转到:

    [("c1r1","c2r1","c3r1"),("c1r2","c2r2","c3r2"),("c1r3","c2r3","c3r3")]
    

1 个答案:

答案 0 :(得分:5)

>>> result = [("c1r1","c1r2","c1r3"),("c2r1","c2r2","c2r3"),("c3r1","c3r2","c3r3")]
>>> apply(map, [None] + result)
[('c1r1', 'c2r1', 'c3r1'), ('c1r2', 'c2r2', 'c3r2'), ('c1r3', 'c2r3', 'c3r3')]

使用第一个参数map调用None,然后使用3个元组作为其余参数。相当于:

>>> map(None, *result)
[('c1r1', 'c2r1', 'c3r1'), ('c1r2', 'c2r2', 'c3r2'), ('c1r3', 'c2r3', 'c3r3')]

但是对于此操作,您应该使用交叉兼容的zip(*result)

>>> zip(*result)
[('c1r1', 'c2r1', 'c3r1'), ('c1r2', 'c2r2', 'c3r2'), ('c1r3', 'c2r3', 'c3r3')]

在Python 3上,如果需要列表,可能需要使用list(zip(*result))