Python列表列表->;生成元素n的子列表

Python列表列表->;生成元素n的子列表,python,Python,如果我有一个列表,例如: [[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]] >>> [ite

如果我有一个列表,例如:

[[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]

您的try
list[:][0]
无效,因为
list[:]
复制了
list
,而
list[:][0]
获取了副本的第一个子列表,而不是子列表的第一个元素。另外,避免命名变量
列表
,因为它会隐藏内置的
列表

这里有一个解决方案可以为您提供所需的输出,但正如@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
切片更容易使用,而且它似乎与您对上述问题的直觉非常吻合。而且,使用大型阵列时,速度可能会快得多。也就是说,对于这种大小的阵列,速度显然要慢得多,将timeit结果发布如下:

>>> 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