我有一个成对字典的列表,像这样:
[{'Anna': {'star': 5, 'banana': 12, 'bag': 7}, 'Ben': {'star': 5, 'banana': 12, 'melon': 1}},
{'Anna': {'star': 5, 'banana': 12, 'bag': 7}, 'Cam': {'star': 65, 'melon': 1}},
{'Anna': {'star': 5, 'banana': 12, 'bag': 7}, 'Den': {'juice': 0, 'cake': 4}}, ...]
我需要比较两对的最小值(以分数为单位),但是我们只关注焦点人物中的项目,在这种情况下为Anna。
以第一对为例,
“安娜”和“本”的共同点是“明星”和“香蕉”。因为我们只关心焦点人物“安娜”,所以我们只需要找到“星星”,“香蕉”和“袋子”的最小值即可。
然后,在将两对最小值进行比较之后,将其减去1:
Ans = 1 - min('star':[5/24, 5/18], 'banana':[12/24, 12/24], 'bag':[7/24, 0])
所以理想的结果是
Anna-Ben = Ans1
Anna-Cam = Ans2
Anna-Den = Ans3
.
.
.
.
任何想法如何实现这一目标?非常感谢,对不起我的英语!
*编辑:
您好,谢谢您的答复,但我要的是1减去各项的最小值。就像“ Anna-Ben”对一样,
[p / min]在[5/24,5/18]之间的“星标”分钟为5/24, 在[12/24,12/18]之间“香蕉”的min为12/24,并且
在[7/24,0]之间的“袋子”的min为0(只有Anna拥有袋子,Ben没有袋子,所以它为零)。
我们忽略了“本”中的“甜瓜”项目,因为我们只关注焦点人物“安娜”。
因此'Anna-Ben'对的最终结果应为[1-5/24-12/24-0 = 7/24]。
答案 0 :(得分:1)
希望我能正确理解您的问题。
data = [
{'Anna': {'star': 5, 'banana': 12, 'bag': 7}, 'Ben': {'star': 5, 'banana': 12, 'melon': 1}},
{'Anna': {'star': 5, 'banana': 12, 'bag': 7}, 'Cam': {'star': 65, 'melon': 1}},
{'Anna': {'star': 5, 'banana': 12, 'bag': 7}, 'Den': {'juice': 0, 'cake': 4}}
]
results = {}
# iterate over each pair
for pair in data:
anna_data = pair.pop("Anna")
other_name, other_data = pair.popitem() # get comparing data
result = 1
anna_sum = float(sum(anna_data.values()))
other_sum = float(sum(other_data.values()))
# iterate over each of anna's item
for item, anna_val in anna_data.items():
other_val = other_data.get(item, 0) # set 0 if the item is not found in other_data
min_item = min(anna_val/anna_sum, other_val/other_sum)
result -= min_item
# save the result to a wonderful dict
key = "Anna-%s" % other_name
results[key] = result
print(results)
结果:
{'Anna-Ben': 0.29166666666666663, 'Anna-Cam': 0.7916666666666666,'Anna-Den': 1.0}
按照我销毁数据列表的方式,如果要保持数据列表完整无缺,请在计算该数据列表之前对其进行复制()。