簡體   English   中英

生成包含多個元素的新項目的列表

[英]Generate list with new items that contains more than one element

我有一個數組a 我想創建兩倍大小的新數組,其中項目是x * 2和x * 3。

例如: a = [1,10,100]結果必須為b = [2,3,20,30,200,300]

我知道這種方式(丑陋且非常慢): b = sum([[x*2,x*3] for x in a], [])

還有其他方法(我真的想最短的方法:)?

可以使用帶有嵌套循環的列表理解來完成

In [4]: [y for x in a for y in (x * 2, x * 3)]
Out[4]: [2, 3, 20, 30, 200, 300]

似乎勝過所有答案,但是當a很大時,就會輸給numpy解決方案。

您可以對列表進行乘法運算,然后zip並展平結果列表。

>>> a = [1,10,100]
>>> b = [j for i in zip([i*2 for i in a], [i*3 for i in a]) for j in i]
>>> b
[2, 3, 20, 30, 200, 300]

您可以通過幾種方法執行此操作。 以下是其中之一,使用numpy(第4行):

In [1]: import numpy as np

In [2]: a = [1, 10, 100]

In [3]: %timeit sum([[x*2,x*3] for x in a], [])
1000000 loops, best of 3: 632 ns per loop

In [4]: %timeit x = np.array(a); np.array([x*2,x*3]).T.ravel()
100000 loops, best of 3: 3.25 µs per loop

您的方法更快! 但這是因為a小。 當它更大時,numpy變得更好。

In [5]: a = range(1000)

In [6]: %timeit sum([[x*2,x*3] for x in a], [])
100 loops, best of 3: 2.37 ms per loop

In [7]: %timeit x = np.array(a); np.array([x*2,x*3]).T.ravel()
10000 loops, best of 3: 39.6 µs per loop

包含@CoryKramer的上述答案的timeit結果,這對於小型數組最快,但對於大型數組卻會變得麻木:

In [10]: a = [1, 10, 100]

In [11]: %timeit [j for i in zip([i*2 for i in a], [i*3 for i in a]) for j in i]
1000000 loops, best of 3: 853 ns per loop

In [12]: a = range(1000)

In [13]: %timeit [j for i in zip([i*2 for i in a], [i*3 for i in a]) for j in i]
1000 loops, best of 3: 252 µs per loop

通常使用元組比列表快:

>>> timeit.timeit("sum([[x*2,x*3] for x in (1,10,100)], [])", number=10000)
0.023060083389282227
>>> timeit.timeit("sum(((x*2,x*3) for x in (1,10,100)), ())", number=10000)
0.01667189598083496

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM