字典或列表是我o / p的合适数据结构?

时间:2017-06-14 06:50:51

标签: python python-3.x

我有一个列表,类似于以下o / p的1000行,我将存储在列表变量中。

现在我想在所有这些行中找到最大键和值

sensors ={'porscheLfsFixit': 0, 'porscheDiskWrite': 1786, 'porscheDiskGcLoad': 0, 'porscheLfsFixit': 0, 'porscheEncrypt': 0, 'porscheDiskGcReap': 0, 'porscheCompress': 0, 'porscheDiskWrite': 1786, 'porscheRaidRebuild': 384, 'porscheCompress': 0, 'porscheDiskGcReap': 0, 'porscheEncrypt': 0, 'porscheRaidRebuild': 384, 'porscheDiskGcLoad': 0}
{'porscheLfsFixit': 0, 'porscheDiskWrite': 1786, 'porscheDiskGcLoad': 0, 'porscheLfsFixit': 0, 'porscheEncrypt': 0, 'porscheDiskGcReap': 0, 'porscheCompress': 0, 'porscheDiskWrite': 1796, 'porscheRaidRebuild': 389, 'porscheCompress': 0, 'porscheDiskGcReap': 50, 'porscheEncrypt': 0, 'porscheRaidRebuild': 3849, 'porscheDiskGcLoad': 0}

我尝试maxValue = max(传感器)

但我只得到这样的o / p:porscheDiskWrite

我希望所有线路的最大值如下:porscheDiskWrite':1796,porscheRaidRebuild':389等。

我需要将此r \ n转换为字典吗?

3 个答案:

答案 0 :(得分:2)

我假设您的源结构是这样的,除了每个字典中有更多项目:

sensors = [{'porscheLfsFixit': 0, 'porscheDiskWrite': 1786, 'porscheRaidRebuild': 384}, {'porscheLfsFixit': 0, 'porscheDiskWrite': 1786, 'porscheRaidRebuild': 9999}]

为了获得key, value对中所有项目中所有项目的最高值,我建议采用这种方法。

sensor_tuples = []
for sensor in sensors:
    sensor_tuples += list(sensor.items())
max_pair = max(sensor_tuples, key= lambda x: x[1])

首先,您将所有配对放入一个列表中:

>>> sensor_tuples
[('porscheDiskWrite', 1786), ('porscheRaidRebuild', 384), ('porscheLfsFixit', 0), ('porscheDiskWrite', 1786), ('porscheRaidRebuild', 9999), ('porscheLfsFixit', 0)]

然后你找到最大值对:

>>> max_pair
('porscheRaidRebuild', 9999)

编辑:

回答评论中的问题。 要获得所有密钥的最大值,首先要定义一个函数,以便为一个密钥获取所有密钥的最大值:

def get_max_for_key(alist, key):
    return max(alist, key=lambda x: x[key])[key]

获取所有密钥:

keys = sensors[0].keys()

为每个键调用函数并将结果放入dict:

max_dict = {}
for key in keys:
    max_dict[key] = get_max_for_key(sensors, key)

我们走了:

>>> max_dict
{'porscheRaidRebuild': 9999, 'porscheLfsFixit': 0, 'porscheDiskWrite': 1786}

答案 1 :(得分:1)

如果你想根据dict的值得到最大值,你可以这样做:

sensors ={'porscheLfsFixit': 0, 'porscheDiskWrite': 1786, 'porscheDiskGcLoad': 0,  
        'porscheLfsFixit': 0, 'porscheEncrypt': 0, 'porscheDiskGcReap': 0,
        'porscheCompress': 0, 'porscheDiskWrite': 1786, 'porscheRaidRebuild': 384, 
        'porscheCompress': 0, 'porscheDiskGcReap': 0, 'porscheEncrypt': 0,
        'porscheRaidRebuild': 384, 'porscheDiskGcLoad': 0}

my_max = max(sensors.items(), key=lambda x: x[1])
print(my_max)
>>> ('porscheDiskWrite', 1786)

因此,此示例中的输出是一个元组。

此外,您不需要将您的dict转换为使用max的列表,并且您也不需要将输出转换为列表以使用它。你可以将它保存为元组,并随心所欲地做任何事情。

PS:我使用max()的关键函数,它是一个lambda函数,它获取sensors.items()每个元素的id = 1的元素。另外,请注意max()的第一个元素必须是可迭代的。 sensors.items()将返回[(key1, value1), ..., (keyN, valueN)]

等元组列表

答案 2 :(得分:0)

*如果您想要找到与零不同的所有值

sensors ={'porscheLfsFixit': 0, 'porscheDiskWrite': 1786, 'porscheDiskGcLoad': 0, 'porscheLfsFixit': 0, 'porscheEncrypt': 0, 'porscheDiskGcReap': 0, 'porscheCompress': 0, 'porscheDiskWrite': 1786, 'porscheRaidRebuild': 384, 'porscheCompress': 0, 'porscheDiskGcReap': 0, 'porscheEncrypt': 0, 'porscheRaidRebuild': 384, 'porscheDiskGcLoad': 0}
>>> val = [(x,y) for x,y in sensors.items() if y>0]
>>> for v in val:
>>>    print(v)

输出

('porscheRaidRebuild',384)

('porscheDiskWrite',1786)

>>> dic = {x:y for x,y in sensors.items() if y>0}
>>> dic

将其置于新的dictonary

输出

{'porscheDiskWrite':1786,'porscheRaidRebuild':384}