簡體   English   中英

Python列表列表->使元素n成為子列表

[英]Python list of lists -> make sublists of element n

如果我有清單清單,例如:

[[2, 0.84], [2, 0.75], [2, 0.63], [2, 0.6]]

有沒有一種快速的方法來獲取內部列表的所有第二個元素的列表? 即,該示例將返回:

[0.84, 0.75, 0.63, 0.6]

我不確定這為什么行不通:

list[:][0]

但這只會在列表中返回一對值。

嘗試:

>>> my_list = [[2, 0.84], [2, 0.75], [2, 0.63], [2, 0.6]]
>>> [item[1] for item in my_list]
[0.84, 0.75, 0.63, 0.6]

您的嘗試list[:][0]不起作用,因為list[:]會復制listlist[:][0]將獲取副本的第一個子列表,而不是子列表的第一個元素。 另外,避免命名變量list因為它會遮蓋內置list

這是一個為您提供所需輸出的解決方案,但是正如@Slater Tyranus的回答所示,這不是最有效的方法。

In [34]: a = [[2, 0.84], [2, 0.75], [2, 0.63], [2, 0.6]]

In [36]: list(zip(*a)[1])
Out[36]: [0.84, 0.75, 0.63, 0.6]

Hasan在一般情況下是正確的,但是如果您通常在尋找這種切片,我建議您開始使用numpy,這實際上是為這種事情而做的。 特別:

>>> import numpy as np

>>> my_array = np.array([[2, 0.84], [2, 0.75], [2, 0.63], [2, 0.6]])
>>> my_array[:, 1]
[0.84, 0.75, 0.63, 0.6]

就我個人而言,我發現numpy切片更容易使用,並且它似乎與您對上述問題的直覺非常吻合。 而且,使用大型陣列時,速度可能會更快。 也就是說,對於這種大小的陣列,顯然要慢得多,在下面發布時間結果:

>>> my_list = [[2, 0.84], [2, 0.75], [2, 0.63], [2, 0.6]]
>>> my_array = np.array(my_list)

>>> timeit.timeit("my_array[:, 1]", setup="from __main__ import my_array", number=10000)
0.016569137573242188

>>> timeit.timeit("[item[1] for item in my_list]", setup="from __main__ import my_list", number=10000)
0.006146907806396484

>>> timeit.timeit("list(zip(*my_list)[1])", setup="from __main__ import my_list", number=10000)
0.013128042221069336

為了顯示更清晰的圖片,我在一個較大的示例中運行了結果,以顯示這些不同方法的縮放比例:

>>> my_array = np.random.rand(100,100)
>>> my_list = my_array.tolist()

>>> timeit.timeit("my_array[:, 1]", setup="from __main__ import my_array", number=10000)
0.019372940063476562

>>> timeit.timeit("[item[1] for item in my_list]", setup="from __main__ import my_list", number=10000)
0.07012009620666504

>>> timeit.timeit("list(zip(*my_list)[1])", setup="from __main__ import my_list", number=10000)
1.2308871746063232

暫無
暫無

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

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