Python 在更大的数组中连接所有数组
我有一个很大的数组,里面有很多子数组,我正在尝试加入所有的子数组。我知道如何连接数组,但由于内部数组的数量不同,我不知道如何使用一个函数来连接这些数组。我知道我需要一个或多个循环,但不知道如何做。到目前为止,我一直像这样手动操作,并一直进行到最后一个索引:Python 在更大的数组中连接所有数组,python,arrays,Python,Arrays,我有一个很大的数组,里面有很多子数组,我正在尝试加入所有的子数组。我知道如何连接数组,但由于内部数组的数量不同,我不知道如何使用一个函数来连接这些数组。我知道我需要一个或多个循环,但不知道如何做。到目前为止,我一直像这样手动操作,并一直进行到最后一个索引: ldata = ldata[0]+ldata[1]+ldata[2]+ldata[3]+ldata[4] 其中ldata是较大的列表,所有索引都是内部列表。我该怎么做 编辑:下面是一个例子 a = [[1,2],[3,4],[5,6]]
ldata = ldata[0]+ldata[1]+ldata[2]+ldata[3]+ldata[4]
其中ldata是较大的列表,所有索引都是内部列表。我该怎么做
编辑:下面是一个例子
a = [[1,2],[3,4],[5,6]]
您可以使用:
输出
如果列表不太长,请保持简单:
>>> a
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> sum(a, [])
[1, 2, 3, 4, 5, 6, 7, 8, 9]
我做了一些计时测量:
>>> timeit.timeit('sum([[1,2,3],[4,5,6],[7,8,9]], [])')
6.547808872535825
>>> timeit.timeit('reduce(lambda a, c: a + c, [[1,2,3],[4,5,6],[7,8,9]], [])', setup="from functools import reduce")
10.435796303674579
列表越多,列表越长,使用chain的解决方案的性能会更好:
a = [list(range(20)) for x in range(30)]
def test_sum():
return sum(a, [])
def test_chain():
return list(itertools.chain.from_iterable(a))
def test_add():
result = []
for i in a:
result += i
return result
def test_list_comprehension():
return [x for l in a for x in l]
print(timeit.timeit(test_sum), timeit.timeit(test_chain), timeit.timeit(test_add), timeit.timeit(test_list_comprehension))
屈服
18.778313734044787 7.5882537689758465 2.5082976589910686 13.912770285038278
这表明用一个简短的函数将数组相加也很好。您可以抓取每个子列表并添加到一个新列表中
new_ldata = []
for sublist in ldata:
new_ldata += sublist
您可以使用numpy连接来实现此目的
import numpy as np
x = [[1,1],[2,2,2],[3],[4,4,4,4]]
concated_x = np.concatenate(x) # now in numpy array form
concated_x = list(concated_x) # if you want it back to a list form
你能添加一个例子吗?看看reduce或functools.reduce,所有答案都取决于Python版本库!如果我能接受的话,我会接受更多,但霍克尔的一个是最简单的,我是第一个看到它的。@Athreyaadaniel:sum的表面简单性隐藏了在引擎盖下发生的二次复制。你说你有一个很大的数组,里面有很多子数组;有了大量的子数组,当一个更高效的实现在不到一秒钟内完成时,你可以花费数小时到数周的时间等待求和。我建议你接受另一个答案,而不是我的答案。太好了!虽然文档说明了级联一系列迭代,但是考虑使用ItTraveStudioStand谢谢,这是一个简单而有效的解决方案!如果内置模块同样工作良好,为什么要使用它呢?因为它不工作。尝试使用itertools.chain加入一百万个列表,甚至不需要一秒钟。试着用sum来做这件事,几个小时后你就要回来了。事实上,它开始的时间要快得多,我没想到sum会那么糟糕……这个解决方案似乎有最好的性能,但不要在阴影中列出变量列表。是的,我的不好。我想写“子列表”,但没有。。。
new_ldata = []
for sublist in ldata:
new_ldata += sublist
import numpy as np
x = [[1,1],[2,2,2],[3],[4,4,4,4]]
concated_x = np.concatenate(x) # now in numpy array form
concated_x = list(concated_x) # if you want it back to a list form