合并2个列表列表到元组列表

时间:2018-10-29 15:45:22

标签: python list

我正在尝试将不同的嵌套列表合并为元组列表(x,y) 其中x来自第一个嵌套列表,y来自第二个嵌套列表。

nested_list1 = [[1, 2, 3],[3],[0, 3],[1]]
nested_list2 = [[.0833, .0833, .0833], [.2], [.175, .175], [.2]]

当您将它们组合时,应该是:

result = [(1,.0833), (2,.0833), (3,.0833), (3,.2), (0,.175), (3,.175), (1,.2)]

我的方法是,我需要遍历列表列表并一次将它们加入1。 我知道要像这样遍历1个嵌套列表:

for list in nested_list1:
    for number in list:
        print(number)

但是我不能同时遍历2个嵌套列表。

for list, list in zip(nested_list1, nested_list2):
    for number, prob in zip(list,list):
        print(tuple(number, prob)) #will not work

有什么想法吗?

8 个答案:

答案 0 :(得分:1)

您可以通过列表进行两次zip

lst1 = [[1, 2, 3],[3],[0, 3],[1]]
lst2 = [[.0833, .0833, .0833], [.2], [.175, .175], [.2]]

print([(u, v) for x, y in zip(lst1, lst2) for u, v in zip(x, y)])

或使用itertools.chain.from_iterable展平列表和zip

from itertools import chain

lst1 = [[1, 2, 3],[3],[0, 3],[1]]
lst2 = [[.0833, .0833, .0833], [.2], [.175, .175], [.2]]

print(list(zip(chain.from_iterable(lst1), chain.from_iterable(lst2))))

答案 1 :(得分:1)

使用itertools.chain

>>> nested_list1 = [[1, 2, 3],[3],[0, 3],[1]]
>>> nested_list2 = [[.0833, .0833, .0833], [.2], [.175, .175], [.2]]
>>> import itertools
>>> res = list(zip(itertools.chain.from_iterable(nested_list1), itertools.chain.from_iterable(nested_list2)))
>>> res
[(1, 0.0833), (2, 0.0833), (3, 0.0833), (3, 0.2), (0, 0.175), (3, 0.175), (1, 0.2)]

答案 2 :(得分:0)

整理列表,然后传递给zip()

list1 = [item for sublist in nested_list1 for item in sublist]
list2 = [item for sublist in nested_list2 for item in sublist]
final = list(zip(list1, list2))

收益:

[(1, 0.0833), (2, 0.0833), (3, 0.0833), (3, 0.2), (0, 0.175), (3, 0.175), (1, 0.2)]

答案 3 :(得分:0)

result = []
[result.extend(list(zip(x, y))) for x in nested_list1 for y in nested_list2]
print(result)

答案 4 :(得分:0)

您的代码中有2个错误:

  1. 您两次隐藏了内置list,并且无法区分两个变量。不要这样做。
  2. 您使用tuple(x, y)创建了一个tuple形式2变量。这是不正确的,因为tuple仅接受一个参数。要构造两个变量的元组,只需使用语法(x, y)

这将起作用:

for L1, L2 in zip(nested_list1, nested_list2):
    for number, prob in zip(L1, L2):
        print((number, prob))

更惯用的是将嵌套列表展平;例如,通过itertools.chain

from itertools import chain

res = list(zip(chain.from_iterable(nested_list1),
               chain.from_iterable(nested_list2)))

[(1, 0.0833), (2, 0.0833), (3, 0.0833), (3, 0.2), (0, 0.175), (3, 0.175), (1, 0.2)]

答案 5 :(得分:0)

这支班轮将实现您想要的。

reduce(lambda x, y: x+y, [[(i, j) for i, j in zip(x,y)] for x, y in zip(nested_list1, nested_list2)])

答案 6 :(得分:0)

一种方法是将两个嵌套列表都转换为完整列表,然后使用zip。下面的示例代码:

>>> nested_list1 = [[1, 2, 3],[3],[0, 3],[1]]
>>> nested_list2 = [[.0833, .0833, .0833], [.2], [.175, .175], [.2]]
>>> new_list1 = [x for val in nested_list1 for x in val]
>>> new_list2 = [x for val in nested_list2 for x in val]
>>> print new_list1
[1, 2, 3, 3, 0, 3, 1]
>>> print new_list2
[0.0833, 0.0833, 0.0833, 0.2, 0.175, 0.175, 0.2]
>>> new_val = zip(new_list1, new_list2)
>>> print new_val
[(1, 0.0833), (2, 0.0833), (3, 0.0833), (3, 0.2), (0, 0.175), (3, 0.175), (1, 0.2)]

答案 7 :(得分:0)

使用两次zip压缩列表并使其变平

from functools import reduce
reduce(lambda x,y: x+y,[(zip(i,j)) for i,j in zip(nested_list1,nested_list2)])

您也可以使用chain进行拼合

from itertools import chain
list(chain(*[(zip(i,j)) for i,j in zip(nested_list1,nested_list2)]))

输出

[(1, 0.0833), (2, 0.0833), (3, 0.0833), (3, 0.2), (0, 0.175), (3, 0.175), (1, 0.2)]