将嵌套列表拆分为两个列表

15

我有一个嵌套列表,像这样:

    my_list = [[1320120000000, 48596281], [1320206400000, 48596281], [1320292800000, 50447908]]

我希望将它分割成类似于这样的东西:

    my_list1 = [48596281, 48596281, 50447908] 
    my_list2 = [1320120000000, 1320206400000, 1320292800000]    

我知道这很简单,但我一直没有成功。任何帮助都将不胜感激。


从Python文档中(http://docs.python.org/2/library/functions.html#zip):`zip()与*运算符结合使用可用于解压列表。` - kreativitea
3个回答

29
这就是内置函数zip的作用。
my_list2, my_list1 = zip(*my_list)

如果你想要列表而不是元组,你可以这样做:

my_list2, my_list1 = map(list, zip(*my_list))

谢谢您的回答,如果我不知道*my_list中有多少个嵌套列表,我该怎么办? - Revolucion for Monica
在这种情况下,可能会使用my_lists = zip(*my_list),然后通过len(my_lists)来了解最终得到了多少个列表。 - Drachenfels
我发现zip的问题在于,即使您的嵌套列表完全对称,您仍可能得到混乱的数据。因此,列表推导式可能稍微好一些,请考虑以下内容: ab = [['a', 'A', 0], ['b', 1], ['c', 'C', 2]]; print(list(zip(*ab))); [('a', 'b', 'c'), ('A', 1, 'C')] - Drachenfels

8
你可以使用列表推导式。
my_list1 = [i[1] for i in my_list]
my_list2 = [i[0] for i in my_list]

4

使用 列表推导式:

In [6]: lis1,lis2=[x[0] for x in my_list],[x[1] for x in my_list]
In [7]: lis1
Out[7]: [1320120000000L, 1320206400000L, 1320292800000L]

In [8]: lis2
Out[8]: [48596281, 48596281, 50447908]

或者使用operator.itemgetter()

In [19]: lis1,lis2=map(itemgetter(0),my_list) , map(itemgetter(1),my_list)

In [20]: lis1
Out[20]: [1320120000000L, 1320206400000L, 1320292800000L]

In [21]: lis2
Out[21]: [48596281, 48596281, 50447908]

timeit 比较:

In [42]: %timeit lis1,lis2=[x[0] for x in my_list],[x[1] for x in my_list]  #winner if lists are required
100000 loops, best of 3: 1.72 us per loop

In [43]: %timeit my_list2, my_list1 = zip(*my_list) # winner if you want tuples
1000000 loops, best of 3: 1.62 us per loop

In [44]: %timeit my_list2, my_list1 = map(list, zip(*my_list))
100000 loops, best of 3: 4.58 us per loop

In [45]: %timeit lis1,lis2=map(itemgetter(0),my_list),map(itemgetter(1),my_list)
100000 loops, best of 3: 4.4 us per loop

如果每个元组都有三个元素 [(a,b,c) (x,y,z)],我想在一个地方提取 (a,b) (x,y),在另一个地方提取 (c,z)。请告诉我如何进行。 - DJ_Stuffy_K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接