我有两个嵌套列表,list_a
和list_b
:
list_a=[['a','b'],['c','d','e'],['f','g','f']]
list_b=[[5,7],[2,3,2],[4,7,8]]
我正在尝试生成list_c
,这是将list_a
中的每个元素与其在list_b
中的对应元素合并的结果,例如list_a[1][1]
与list_b[1][1]
和list_a[1][2]
与list_b[1][2]
等,以产生元组列表的列表。
list_c=[[('a',5),('b',7)],[('c',2),('d',3),('e',2)],[('f',4),('g',7),('f',8)]]
我已经尝试过:
list_c=[]
for list1 in list_a:
for list2 in list_b:
list_c.append(list(zip(list1,list2)))
但是输出的结果是原始列表中元素的所有可能组合的元组列表:
[[('a', 5), ('b', 7)], [('a', 2), ('b', 3)],
[('a', 4), ('b', 7)], [('c', 5), ('d', 7)],...
[('f', 2), ('g', 3), ('f', 2)],
[('f', 4), ('g', 7), ('f', 8)]]
我觉得我已经接近正确的答案,但是缺少一些简单的东西。如何产生我要寻找的结构的list_c
? (保留顺序很重要,因为我想用它来处理CSV文件)
这是对此处问题的扩展: Concatenate items in two nested lists to pairs in tuples
但是我一直找不到类似的问题,这些问题不涉及将结果列表展平为以下内容:
list_c=[('a',5),('b',7),('c',2),('d',3),('e',2),('f',4),('g',7),('f',8)]
答案 0 :(得分:3)
您需要zip
和list_a
上的list_b
,而不是嵌套的for循环(产品):
效果如下:
[list(zip(a,b)) for a,b in zip(list_a, list_b)]
换句话说:
result = []
for a, b in zip(list_a, list_b):
result.append(list(zip(a,b)))
答案 1 :(得分:0)
使用列表理解
a=[['a','b'],['c','d','e'],['f','g','f']]
b=[[5,7],[2,3,2],[4,7,8]]
c = [list(zip(i,j)) for i,j in zip(a,b)]
print(c)
"""
output
[[('a', 5), ('b', 7)],
[('c', 2), ('d', 3), ('e', 2)],
[('f', 4), ('g', 7), ('f', 8)]]
"""
使用lambda函数,可以通过
完成d=list(map(lambda x,y:list(zip(x,y)),a,b))
print(d)
"""
output
[[('a', 5), ('b', 7)],
[('c', 2), ('d', 3), ('e', 2)],
[('f', 4), ('g', 7), ('f', 8)]]
"""
答案 2 :(得分:0)
list_c = []
for i, element_a in enumerate(list_a):
element_b = list_b[i]
merged_list = []
for j in range(len(element_a)):
merged_list.append((element_a[j], element_b[j]))
list_c.append(merged_list)
为每个列表索引中的每个元素创建新的元组,并追加到主列表中
答案 3 :(得分:0)
由于已经采用了最好和更短的方法..,所以另一个选择具有很好的详细for循环:
list_c = []
for i, a in enumerate(list_a):
tmp = []
for j, b in enumerate(list_b[i]):
tmp.append((a[j], b))
list_c.append(tmp)
list_c
#=> [[('a', 5), ('b', 7)], [('c', 2), ('d', 3), ('e', 2)], [('f', 4), ('g', 7), ('f', 8)]]