比较嵌套字典中的最小值

时间:2019-05-11 20:09:55

标签: python python-3.x algorithm dictionary

我有一个成对字典的列表,像这样:

[{'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]。

1 个答案:

答案 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}

按照我销毁数据列表的方式,如果要保持数据列表完整无缺,请在计算该数据列表之前对其进行复制()。