将存储在元组列表的列表中的两个元素元组制作成两个列表的方法。

9

我有一个包含许多列表的列表,其中每个列表中都有4个元组。

my_list = [[(12, 1), (10, 3), (4, 0), (2, 0)],
           [(110, 1), (34, 2), (12, 1), (55, 3)]]

我希望它们分别列在两个列表中,如下所示:
my_list2 = [12,10,4,2,110,34,12,55]
my_list3 = [1,3,0,0,1,2,1,3]

我的尝试是使用map函数来实现这个。

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

但是这给了我一个错误:

ValueError: too many values to unpack (expected 2)
8个回答

10

您的方法非常接近,但是您需要先将其展开:

from itertools import chain

my_list = [[(12, 1), (10, 3), (4, 0), (2, 0)], [(110, 1), (34, 2), (12, 1), (55, 3)]]

my_list2 , my_list3 = map(list,zip(*chain.from_iterable(my_list)))

my_list2
# [12, 10, 4, 2, 110, 34, 12, 55]

my_list3
# [1, 3, 0, 0, 1, 2, 1, 3]

4
另一种非Python风格的方法:
my_list = [[(12, 1), (10, 3), (4, 0), (2, 0)], [(110, 1), (34, 2), (12, 1), (55, 3)]]

first = []
second = []

for inner in my_list:
    for each in inner:
        first.append(each[0])
        second.append(each[1])

print(first)  # [12, 10, 4, 2, 110, 34, 12, 55]
print(second)  # [1, 3, 0, 0, 1, 2, 1, 3]

3

你可以使用列表推导式(5.1.3)

元组的第一个数字:

my_list2 = [tuple[0] for inner in my_list for tuple in inner]

元组的第二个数字:

my_list3 = [tuple[1] for inner in my_list for tuple in inner]

3

试一下:

my_list = [[(12, 1), (10, 3), (4, 0), (2, 0)], [(110, 1), (34, 2), (12, 1), (55, 3)]]

my_list2, my_list3 = map(list, zip(*[j for i in my_list for j in i]))
print(my_list2)
# [12, 10, 4, 2, 110, 34, 12, 55]
print(my_list3)
# [1, 3, 0, 0, 1, 2, 1, 3]

2
这个怎么样?
my_list = [[(12, 1), (10, 3), (4, 0), (2, 0)], [(110, 1), (34, 2), (12, 1), (55, 3)]]

flatten = lambda l: [item for my_list in l for item in my_list]

list1, list2 = zip(*flatten(my_list))

2
这里有一种方法:
my_list = [[(12, 1), (10, 3), (4, 0), (2, 0)], [(110, 1), (34, 2), (12, 1), (55, 3)]]

my_list2 = [a for b in [[t[0] for t in my_list[i]] for i,n in enumerate(my_list)] for a in b]
my_list3 = [a for b in [[t[1] for t in my_list[i]] for i,n in enumerate(my_list)] for a in b]

print(my_list2)
print(my_list3)

输出:

[12, 10, 4, 2, 110, 34, 12, 55]
[1, 3, 0, 0, 1, 2, 1, 3]

1
如何提供一个极简解决方案:
my_list = [[(12, 1), (10, 3), (4, 0), (2, 0)], [(110, 1), (34, 2), (12, 1), (55, 3)]]

my_list2, my_list3 = zip(*sum(my_list, []))

print(my_list2)
print(my_list3)

输出
> python3 test.py
(12, 10, 4, 2, 110, 34, 12, 55)
(1, 3, 0, 0, 1, 2, 1, 3)
>

也许 my_list2 应该是一个 list,而不是一个 tuplemy_list2, my_list3 = [list(t) for t in zip(*sum(my_list, []))] - Ann Zen
@AnnZen,这取决于OP,但如果my_list2my_list3的各个元素要交换位置,我会感到惊讶。如果是这样,只需使用my_list2 = list(my_list2)my_list3 = [*my_list3]即可,没有必要引入推导式。 - cdlane

0
将元组列表转换为二维数组,然后对数组进行切片。
my_list = [[(12, 1), (10, 3), (4, 0), (2, 0)],
       [(110, 1), (34, 2), (12, 1), (55, 3)]]

a = np.array(my_list)
my_list2= np.array([])
my_list3= np.array([])
my_list2=np.append(my_list2,[item[:,0] for item in a])
my_list3=np.append(my_list3,[item[:,1] for item in a])
print(my_list2)
print(my_list3)

输出:

[ 12.  10.   4.   2. 110.  34.  12.  55.]
[1. 3. 0. 0. 1. 2. 1. 3.]

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