查找字典项列表中的min和max元素

时间:2017-02-14 15:42:29

标签: python list dictionary

我有一个以字典格式存储的元素列表

例如。

input_list = [ {'item1': 2, 'item2': 4, 'item3': 3, 'item4': 5, 'item5': 1, 'item6': 2, 'item7': 2, 'item8': 1, 'item9': 2, 'item10': 5, 'item11': 1, 'item12': 2},
  {'item1': 4, 'item2': 1, 'item3': 6, 'item4': 2, 'item5': 11, 'item6': 3, 'item7': 4, 'item8': 6, 'item9': 1, 'item10': 5, 'item11': 1, 'item12': 3}]

我在input_list中有大约150个元素,我需要创建两个输出列表(output_list_max和output_list_min),它们应该包含元素作为字典,其中项目(即item1,item2..etc)作为键和max / min每个项目的值(以input_list中的条目表示)作为值。

For.e.g

output_list_max = [{'item1': 4, 'item2': 4, 'item3': 6, 'item4': 5, 'item5': 11, 'item6': 3, 'item7': 4, 'item8': 6, 'item9': 2, 'item10': 5, 'item11': 1, 'item12': 3}]

output_list_min = [{'item1': 2, 'item2': 1, 'item3': 3, 'item4': 2, 'item5': 1, 'item6': 2, 'item7': 2, 'item8': 1, 'item9': 1, 'item10': 5, 'item11': 1, 'item12': 2}]

我可以通过遍历列表和词典来实现这一点,但我想知道最有效和pythonic的方法,因为列表和字典最多可以达到1000个。

我希望我能够清除我的意图:)。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:4)

您可以使用for item in swiftyJSON.arrayValue { idHolder.append(item["id"].intValue) //for the inner JSON let innerJSON = item["symptoms"].arrayValue // non need to create a new JSON object if innerJSON.isEmpty { arrayHolder.append("") } else { for symptoms in innerJSON { arrayHolder.append(symptoms["key"].stringValue) } } } zip()配对词典项目:

sorted()

答案 1 :(得分:2)

您可以使用Counter并使用&(元素最小值)和|(元素最大值)使用functools.reduce

from functools import reduce
from collections import Counter

output_list_max = dict(reduce(lambda x,y:x|y,map(Counter,input_list)))
output_list_min = dict(reduce(lambda x,y:x&y,map(Counter,input_list)))

在repl中:

>>> output_list_max
{'item4': 5, 'item10': 5, 'item3': 6, 'item9': 2, 'item8': 6, 'item2': 4, 'item12': 3, 'item7': 4, 'item6': 3, 'item11': 1, 'item1': 4, 'item5': 11}
>>> output_list_min
{'item4': 2, 'item10': 5, 'item3': 3, 'item9': 1, 'item8': 1, 'item2': 1, 'item12': 2, 'item7': 2, 'item6': 2, 'item11': 1, 'item1': 2, 'item5': 1}

请注意,结果是字典,包含单个字典的列表,但将结果放在列表中是没有用的。

这是有效的,因为我们首先使用map将字典列表转换为Counter列表。这是通过使用map(Counter,input_list)完成的。

使用了下一个reduce(..)(在某些函数语言中,这称为fold)。如果您向reduce(..)提供功能[x1,x2,...,xn]的元素f列表,则会返回f(...f(f(x1,x2),x3)...,xn)。在这种情况下,我们因此计算(对于第一个元素x1|x2|x3|...|xn)。由于|是元素最大值,因此我们有一个累加器(到目前为止保持最大值的计数器),并且对于每个新词典,我们计算新的最大值。此结果由reduce返回。