我必须遵循以下列表:
[[(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中做到这一点没有任何头痛?
谢谢!
答案 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])