使用键值对的子集和问题-python



我有一个算法,它输出一个子集,其总和为尽可能接近整数s的值

from itertools import combinations
products = {
"Apple": 5,
"Pear": 4,
"Banana": 8,
"Strawberry": 7,
"Watermelon": 9,
"Lemon": 6,
}

def closest_subset(s, nums):
return min((
c
for i in range(1, len(nums) + 1)
for c in combinations(nums, i)
), key=lambda x: abs(s - sum(x)))

print(closest_subset(11, products.values()))
# Output: (5, 6)

相反,我想从字典中输出项目,如下所示:

# Desired output
{
"Apple": 5,
"Lemon": 6,
}

我如何修改我的代码来实现这一点?

您可以通过将字典项而不是值传递给函数来修改它。为了澄清这一点,我将代码中的nums替换为items。函数的其余部分基本上以相同的方式工作,但组合为您提供了包含键和值的元组的组合。因此,您必须稍微调整min函数key,使其只考虑每个元组的第二个值v2,即实际数量。然后,min函数返回键和值对的元组pof,然后可以在返回之前将其转换为字典。

from itertools import combinations
products = {
"Apple": 5,
"Pear": 4,
"Banana": 8,
"Strawberry": 7,
"Watermelon": 9,
"Lemon": 6,
}

def closest_subset(s, items):
return dict(min((
c
for i in range(1, len(items) + 1)
for c in combinations(items, i)
), key=lambda x: abs(s - sum([v2 for v1, v2 in x]))))

print(closest_subset(11, products.items()))
# Output: {'Apple': 5, 'Lemon': 6}

最新更新