我有一个元组的列表,而该列表本身又包含其他列表:
a = [[(1, 2), (3, 4), (5, 6)], [(7, 8), (9, 10)]]
如何制作一个元组列表:
b = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
朴素的方法是:
b = []
for c in a:
for t in c:
b.append(t)
列表推导式或其他任何想法都可以接受。
我有一个元组的列表,而该列表本身又包含其他列表:
a = [[(1, 2), (3, 4), (5, 6)], [(7, 8), (9, 10)]]
b = [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
朴素的方法是:
b = []
for c in a:
for t in c:
b.append(t)
使用 itertools
示例:
import itertools
a = [[(1, 2), (3, 4), (5, 6)], [(7, 8), (9, 10)]]
print(list(itertools.chain(*a)))
输出:
[(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
chain.from_iterable
来解包,而不是使用*
。 - PM 2Ringa = [[(1, 2), (3, 4), (5, 6)], [(7, 8), (9, 10)]]
sum(a, [])
// [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
b = [[1],[2],[3],[4],[5]]
sum(b, [])
// [1, 2, 3, 4, 5]
sum
来展开列表,这是二次时间。 - juanpa.arrivillaga您不需要追加,而是需要扩展。您可以使用非常简单的循环
a = [[(1, 2), (3, 4), (5, 6)], [(7, 8), (9, 10)]]
single_level_list = []
for lst in a:
single_level_list.extend(lst)
print(single_level_list)
>>> [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
for lst in a: single_level_list += lst
这个代码的可读性更好。 - DSchmidt
[i for b in a for i in b]
? - Ajax1234b = functools.reduce(list.__add__, a)
- Jack Homann
是所有子列表中元素的数量时,时间复杂度为O(N),它只会一次访问每个元素。使用+
运算符每次都会得到一个新列表,每个中间步骤都会再次访问您已经访问过的所有元素... - juanpa.arrivillaga