2013-11-20 105 views
0

我正在尝试创建一个可以执行此操作的函数。如何获取列表并在Python中重新排列列表

>>> rearrange_list([1,2,3],[4,5,6]) 
[[1,4],[2,5],[3,6]] 

到目前为止,我有什么是

def rearrange_list(my_list): 
    i = 0 
    n = 0 
    new_list = [] 
    for i in range(0, len(my_list[n])): 
     for n in range(0,len(my_list)): 
      new_list += [my_list[n][i]] 
      print(new_list) 
      n += 1 
    return new_list 

但是这个代码返回[1, 4, 2, 5, 3, 6],一个列表,而不是 列表的列表就像我想让它和我似乎无法弄清楚如何使 函数根据列表中的列表索引输出列表的列表。

+0

'zip'应该做你想做的。虽然它给了你一个元组列表,而不是列表。 – jazzpi

+0

有没有办法将元组更改为列表?我需要它专门成为一个列表。 – user3014764

回答

0

使用zip()代替:

>>> zip([1,2,3], [4,5,6]) 
[(1, 4), (2, 5), (3, 6)] 

,或者为您的特定可变参数版本:

>>> lsts = ([1,2,3], [4,5,6]) 
>>> zip(*lsts) 
[(1, 4), (2, 5), (3, 6)] 

或结果列表中如果映射元组不会做:

map(list, zip([1,2,3], [4,5,6])) # Python 2 
[list(t) for t in zip([1,2,3], [4,5,6])] # Python 2 and 3 

作为您的功能的替代品:

def rearrange_list(*my_lists): 
    return [list(t) for t in zip(*my_lists)] 
+0

我似乎在最后一位https://eval.in/669542时遇到了一些麻烦。为什么没有输出? – biogeek

+0

@biogeek:因为你没有打印任何东西。 'eval.in'不是Python交互式解释器,没有任何回应。添加一个'print()'调用。 –

+0

@biogeek:正确的叉:https://eval.in/669544 –

1

使用拉链,像这样:

zip(list_a, list_b) 
1

您可以使用ziplist comprehension

>>> def rearrange_lists(a, b): 
...  return [list(x) for x in zip(a, b)] 
... 
>>> rearrange_lists([1,2,3], [4,5,6]) 
[[1, 4], [2, 5], [3, 6]] 
>>> 

注意上面的函数只处理两个列表。如果你想处理任何数量的列表,你可以使用:

>>> def rearrange_lists(*lsts): 
...  return [list(x) for x in zip(*lsts)] 
... 
>>> rearrange_lists([1,2,3], [4,5,6], [7,8,9]) 
[[1, 4, 7], [2, 5, 8], [3, 6, 9]] 
>>> 
+0

非常感谢你!这完全解决了! – user3014764

+0

@icodes更高效的压缩? – agconti

+1

@agconti - 比什么效率更高?如果您的意思是OP的当前代码,那么是的,它的效率更高。内置函数的运行速度比定制函数快得多(当然,如果有任何我不知道的怪异示例,我会说99%的时间)。另外,我的解决方案使用列表理解,几乎总是比for循环快。 – iCodez