【问题标题】:Compare for min values in nested dict比较嵌套字典中的最小值
【发布时间】:2019-05-11 20:09:55
【问题描述】:

我有一个成对字典列表,如下所示:

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

以第一对​​为例,

“Anna”和“Ben”的共同点是“star”和“banana”。由于我们只关心焦点人物'Anna',我们只需要找到'star'、'banana'和'bag'的最小值。

然后,在比较最小值后减去 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 减去每个项目的最小值。就像“安娜-本”对一样,

[5/24, 5/18] 之间的“星”的最小值是 5/24,

在 [12/24, 12/18] 之间“香蕉”的最小值是 12/24,并且

[7/24, 0] 之间的“包”的最小值为 0(只有 Anna 有包,Ben 没有包,所以它为零)。

我们忽略了“Ben”中的“melon”项目,因为我们只关注焦点人物“Anna”。

因此,“安娜-本”对的最终结果应该是 [1 - 5/24 - 12/24 - 0 = 7/24]。

【问题讨论】:

  • 所有项目都需要一分钟吗?我的意思是每个项目的最小值之间的最小值?
  • 用代码编写问题以使用有效代码时非常有帮助。很难理解Ans = 1 - min('star':[5/24, 5/18], 'banana':[12/24, 12/24], 'bag':[7/24, 0]) 的意思,因为它不是有效的python。 Ans 应该在这里是什么?一本字典?单一价值?一份清单?
  • @palvarez 我想要每个项目的最小值,比如这对之间“星”的最小值。
  • @MarkMeyer 是的,你是对的,我很抱歉。 Ans 应该是一个浮点值。

标签: python python-3.x algorithm dictionary


【解决方案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}

顺便说一句,我销毁了数据列表,如果你想保持它的完整性,请在计算之前复制它。

【讨论】:

  • 您好,感谢您的回复,但我想要的是 1 减去每个项目的最小值。就像在“安娜-本”对中一样,“明星”在 [5/24, 5/18] 之间的最小值是 5/24,“香蕉”在 [12/24, 12/18] 之间的最小值是 12/24 ,并且 [7/24, 0] 之间的 'bag' 的最小值为 0(只有 Anna 有 bag,Ben 没有 bag 所以它是零)。我们忽略了“Ben”中的“melon”项目,因为我们只关注焦点人物“Anna”。因此,“安娜-本”对的最终结果应该是 [1 - 5/24 - 12/24 - 0 = 7/24]。
  • @Alex 你去吧!
  • 哇,谢谢!如果我的联系人不是“安娜”,该怎么办?因为我的配对像 A-B、A-C、A-D、B-C、B-D 等等。
  • @Alex 你选择焦点人物的标准是什么?记住字典没有顺序。
  • 我没有真正的标准,我只有一个名字列表,我使用 itertools.combinations 函数生成对,而焦点人物是第一位的。例如,如果 A-B,则 A 是焦点人物,如果 B-C,则 B 成为焦点人物。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多