如何只获取列表中每个项目的第一个元素

时间:2017-05-13 21:20:02

标签: python

我必须遵循以下列表:

[[(640, 92, 0.80969274, 0)], [(524, 180, 0.58553714, 1)], [(494, 181, 0.64085102, 2)], [(477, 338, 0.67508131, 3)], [(554, 480, 0.64356369, 4)]]

我只对项目中的前两个元素感兴趣,例如:

640, 92
524, 180
494, 181

我可以使用

获取它们
print list[1][0][0:2]

但我想做的是采取max和mean by column。 首先,我想对第一列采用max和min,然后从第二列采用max和min。

在matlab中我们可以做类似的事情:

max(list(:,1));
min(list(:,1));
max(list(:,2));
min(list(:,2)));

有没有办法在python中做到这一点没有任何头痛?

谢谢!

3 个答案:

答案 0 :(得分:4)

正如其他答案所指出的那样,从根本上说,你没有为你的任务使用一个好的数据结构。如果你想在Python中使用Matlab的类似功能,你需要使用numpy并且应该看一下pandas。 Python是一种通用编程语言,因此像list这样的序列类型并不能真正有效地完成与Matlab mutli-dimensional数组相同的事情(这是numpy给你的)。但话虽如此, 是一种相对无痛的方式来做你想做的事。如果不使用长度为1的列表列表,每个列表包含一个实际保存数据的元组,您只需使用元组列表,这将变得更加轻松。但是,python让这种沉默变得非常轻松:

>>> x = [[(640, 92, 0.80969274, 0)], [(524, 180, 0.58553714, 1)], [(494, 181, 0.64085102, 2)], [(477, 338, 0.67508131, 3)], [(554, 480, 0.64356369, 4)]]
>>> extracted = [sub[0:2] for l in x for sub in l]

在上面的列表推导中,我只是遍历列表,然后遍历包含元组的(长度为一个)列表,然后从元组(sub)中切割出我想要的列。

现在,要在vanilla python中进行“转置”,请解压缩到zip

>>> for col in zip(*extracted):
...     print("Max: {}".format(max(col)))
...     print("Min: {}".format(min(col)))
...
Max: 640
Min: 477
Max: 480
Min: 92
>>>

顺便说一句,使用Python 3.6通过给我们f字符串使更加无痛!:

>>> for col in zip(*extracted):
...     print(f"Max: {max(col)}")
...     print(f"Min: {min(col)}")
...
Max: 640
Min: 477
Max: 480
Min: 92
>>>

答案 1 :(得分:3)

这是一个列表(长度为1)的元组列表,所以我们只需做一些小工作。

import pandas as pd

df = pd.DataFrame([d[0] for d in data])
df[0].max()
df[1].max()
df[0].mean()
df[0].min()

支持大量的操作。

答案 2 :(得分:-1)

max([x[0][0] for x in list])
min([x[0][0] for x in list])

这需要第一列的最大值和最小值。类似地,对于第二列,您可以这样做:

max([x[0][1] for x in list])
min([x[0][1] for x in list])