我有一个以字典格式存储的元素列表
例如。
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个。
我希望我能够清除我的意图:)。
任何帮助将不胜感激!
答案 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
返回。