如果我有一个列表,例如:
[[2, 0.84], [2, 0.75], [2, 0.63], [2, 0.6]]
有没有快速获取内部列表的所有第二个元素的列表?即,该示例将返回:
[0.84, 0.75, 0.63, 0.6]
我不完全确定为什么这不起作用:
list[:][0]
但是只返回列表中的一对值。
答案 0 :(得分:3)
尝试:
>>> 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]
答案 1 :(得分:2)
您的尝试list[:][0]
不起作用,因为list[:]
制作了list
的副本,list[:][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]
答案 2 :(得分:2)
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