繁体   English   中英

Python从字典列表中获取最大值和最小值

[英]Python get max and min from list of dicts

我如何从这样的代码中获取最大值和最小值:

[{'sum': 44, 'code': 'A'}, 
{'sum': 1,   'code': 'B'}, 
{'sum': 44,  'code': 'B'}, 
{'sum': 33,  'code': 'B'}, 
{'sum': 2,   'code': 'C'}, 
{'sum': 694, 'code': 'A'}, 
{'sum': 12,  'code': 'B'}, 
{'sum': 5,   'code': 'C'}]

我需要这样的结果:

#max
[{'sum': 694, 'code': 'A'},
{'sum': 44,  'code': 'B'},
{'sum': 5,   'code': 'C'}]

#min
[{'sum': 44, 'code': 'A'},
{'sum': 1,  'code': 'B'},
{'sum': 2,   'code': 'C'}]

您可以使用itertools.groupby 如何使用Python的itertools.groupby()? 有关详细信息,请参见max的key参数。 这使得代码很短:

from itertools import groupby


input = [
    {'sum': 44, 'code': 'A'}, 
    {'sum': 1,   'code': 'B'}, 
    {'sum': 44,  'code': 'B'}, 
    {'sum': 33,  'code': 'B'}, 
    {'sum': 2,   'code': 'C'}, 
    {'sum': 694, 'code': 'A'}, 
    {'sum': 12,  'code': 'B'}, 
    {'sum': 5,   'code': 'C'}
]

# groupby requires its input to be sorted by group key
input.sort(key=lambda x: (x['code'], x['sum'])

maximums = list()
minimums = list()

for code, group in groupby(input, key=lambda x: x['code']):
    group = list(group)  # Consume iterator
    maximums.append(group[-1])
    minimums.append(group[0])

print 'max:', maximums
print 'min:', minimums

这将使您:

max: [{'sum': 694, 'code': 'A'}, {'sum': 44, 'code': 'B'}, {'sum': 5, 'code': 'C'}]
min: [{'sum': 44, 'code': 'A'}, {'sum': 1, 'code': 'B'}, {'sum': 2, 'code': 'C'}]
from operator import itemgetter
from itertools import groupby

sorted1 = sorted(my_list,key=itemgetter("code","sum")) 
#the line above is where the magic happens it sorts the list first on code and then on sum, this leads it to be grouped by code and within each group the results are sorted
maxes = []
mins = []
for code,results in groupby(sorted1,itemgetter("code"))
    results = list(results)
    maxes.append(results[-1])
    mins.append(results[0])

您可以设置字典来保存最大值和最小值。 然后遍历列表中的每个字典项,并与最大值和最小值进行比较,并根据需要进行更新。 另外,在最大/最小词典中插入新代码。

max_ = {}
min_ = {}

for item in lst:
    code, val = item['code'], item['sum']
    if code not in max_ or val > max_[code]:
        max_[code] = val
    if code not in min_ or val < min_[code]:
        min_[code] = val

>>> max_
{'A': 694, 'B': 44, 'C': 5}

>>>min_
{'A': 44, 'B': 1, 'C': 2}

如果您需要指定的格式,可以按以下步骤轻松恢复:

[{'code': code, 'sum': val} for code, val in max_.iteritems()]
# Max
[{'code': 'A', 'sum': 694}, {'code': 'C', 'sum': 5}, {'code': 'B', 'sum': 44}]

您可以使用自定义比较键:

max(my_list, key=lambda my_dict: my_dict.keys()[0])
def get_max(lst):
    dict = {}
    for el in lst:
        code = el['code']
        sum = el['sum']
        if code in dict:
            if dict[code] < sum:
                dict[code] = sum
        else:
            dict[code] = sum
    return dict


def get_min(lst):
    dict = {}
    for el in lst:
        code = el['code']
        sum = el['sum']
        if code in dict:
            if dict[code] > sum:
                dict[code] = sum
        else:
            dict[code] = sum
    return dict

这将使您:

{'A': 694, 'C': 5, 'B': 44}

{'A': 44, 'C': 2, 'B': 1}

强制单线:

[max((v for v in vals if v['code'] == x), key=lambda y:y['sum']) for x in set(v['code'] for v in vals)]
>>> [{'sum': 694, 'code': 'A'}, {'sum': 5, 'code': 'C'}, {'sum': 44, 'code': 'B'}]

细节:

  • set(v['code'] for v in vals)获得唯一的代码
  • v for v in vals if v['code'] == x根据code == x过滤值, v for v in vals if v['code'] == x
  • max(..., key=lambda y:y['sum'])根据sum字段给出最大值

现在,创建代码集,然后基于该代码集进行重新过滤不是很有效, group_by方法更为group_by

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM