簡體   English   中英

從多維列表的每個子列表中訪問給定元素而不使用 for 循環

[英]Accessing given element from each sublist of multidimensional list without for loop

假設我有一個列表列表,例如:

list0 = [[a, .5, .3], [b, .3, .8], [c, .7, 1.3], [d, 1.03, .2]]

我想將 output 的每個子列表的第二個元素調用到我認為這可行的列表中。

輸入: print(list0[:][1])

output: [b, .3, .8]

但我希望得到這個: (.5, .3, .7, 1.03)

有沒有一種方法可以調用所有子列表並訪問它們的元素,而無需遍歷整個列表來創建新列表? 您能否比較時間並描述為什么我們不能調用所有或一系列子列表來從每個子列表中獲取一個元素而不循環兩次,一次獲取子列表,一次訪問每個子列表?

只需使用列表理解 -

second_element_of_each_sublist = [x[1] for x in list0]

或者,使用mapitemgetter -

from operator import itemgetter
second_element_of_each_sublist  = list(map(itemgetter(1), list0))

完全避免循環不會發生,至少如果你考慮到幕后可能發生的事情。 就是效率問題。。。

In [196]: list0 = [['a', .5, .3], ['b', .3, .8], ['c', .7, 1.3], ['d', 1.03, .2]]

一些比較時間:

推薦的列表理解:

In [197]: timeit [l[1] for l in list0]
410 ns ± 17.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

從“轉置”的列表版本開始:

In [198]: timeit list(zip(*list0))[1]
661 ns ± 3.63 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

從數組中選擇一列:

In [199]: timeit np.array(list0)[:,1]
16 µs ± 177 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

numpy問題經常問“沒有循環”的原因是 Python 級別迭代在 numpy ZA3CBC3F9D0CE2DF2C156 上是慢的。 在可能的情況下,我們希望使用快速編譯的 numpy 代碼(仍然有循環)。 但是從列表開始時,創建數組的成本相對較高。

從數組開始,列索引很快:

In [200]: %%timeit A = np.array(list0)
     ...: A[:,1]
325 ns ± 11.6 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

數組上的迭代比列表上的相同迭代慢:

In [201]: %%timeit A = np.array(list0)
     ...: [a[1] for a in A] 
5.47 µs ± 96.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

暫無
暫無

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

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