如何在嵌套列表 Python 中连接两个列表?

How do I concatenate two lists inside nested list Python?

如何在嵌套列表 Python 中连接两个列表?

我有这个列表

lists_of_lists =[[[1],[2]],[[3],[5]],[[6],[6]]]

我的预期输出是

lists_of_lists =[[1,2],[3,5],[6,6]]

我试过这种方法

new = []
lists_of_lists =[[[1],[2]],[[3],[5]],[[6],[6]]]
for i in range(len(lists_of_lists)):
    for list in  lists_of_lists[i]:
        for element in list:
            new.append(element)
print(new)

但是我得到了

[1, 2, 3, 5, 6, 6]

感谢您的任何建议

尝试 numpy:

在:

import numpy as np
lists_of_lists =np.array([[[1],[2]],[[3],[5]],[[6],[6]]])
lists_of_lists.reshape(lists_of_lists.size//2, 2)

输出:

array([[1, 2],
       [3, 5],
       [6, 6]])

您可以使用 operator.concat() to group 2 separate lists into one and itertools.starmap() 遍历主列表并解压内部列表:

from operator import concat
from itertools import starmap

result = list(starmap(concat, lists_of_lists))

您也可以使用内置 map() 函数和 lambda 表达式 (但为什么呢?)[ 而无需导入=33=]:

result = list(map(lambda x: x[0] + x[1], lists_of_lists))

你也可以使用chain.from_iterable():

from itertools import chain

result = list(map(list, map(chain.from_iterable, lists_of_lists)))

但是如果您想修补您编写的代码以使其按预期工作:

lists_of_lists =[[[1],[2]],[[3],[5]],[[6],[6]]]
new = []
for sub_list in lists_of_lists:
    new_item = []
    for item in sub_list:
        for element in item:
           new_item.append(element)
    new.append(new_item)
[[i for inner in sub_lists for i in inner] for sub_lists in lists_of_lists]

# [[1, 2], [3, 5], [6, 6]]

你可以试试这个。

[sum(i,[]) for i in lists_of_lists]

[[1, 2], [3, 5], [6, 6]]

一些 timeit 对建议解决方案的分析(python 3.7 和 windows 10)

基准列表=[[[1],[2]],[[3],[5]],[[6],[6]]]

In [48]: timeit [sum(i,[]) for i in lists_of_lists]
914 ns ± 103 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [49]: timeit [[i for inner in sub_lists for i in inner] for sub_lists in lists_of_lists]
1.25 µs ± 136 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [64]: timeit list(starmap(concat, lists_of_lists))
639 ns ± 30 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

In [70]: timeit list(map(list, map(chain.from_iterable, lists_of_lists)))
1.55 µs ± 57 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

基准列表=l=[[[1],[2]],[[3],[5]],[[6],[6]]]*1000000(300万)。

In [60]: timeit [sum(i,[]) for i in l]
1.06 s ± 68 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [61]: timeit [[i for i in j] for j in l]
1.13 s ± 64.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [65]: timeit list(starmap(concat, l))
595 ms ± 15.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [71]: timeit list(map(list, map(chain.from_iterable, l)))
1.39 s ± 101 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
result = []
for subList in lists_of_lists:
    newList = []
    for subSubList in subList:
        newList.extend(subSubList)
    result.append(newList)

并且result包含了想要的内容。

我希望这是可读的

lists_of_lists =[[[1],[2]],[[3],[5]],[[6],[6]]]

def concat_inner(arr):
    return arr[0]+ arr[1]

final_list = list(map(concat_inner, lists_of_lists))

print(final_list)

你彻底走向低级了。只需降低一层深度并将列表展平。

lists_of_lists =[[[1],[2]],[[3],[5]],[[6],[6]]]
for i in lists_of_lists:
    flat_list = [item for sublist in i for item in sublist]
    new.append(flat_list)
print(new)