首页 > 解决方案 > Python中键值对的排列

问题描述

在我陈述我的问题之前,我希望知道我搜索了以前的堆栈溢出问题,例如这个Python permutation,但它们没有解决我的具体问题。

假设我有一本关于水果及其成本的字典以及预算。

items = {'Apple': 1, 'Pear': 3, 'Orange': 2, 'Banana' : 4, 'Grape' : 3, 'Melon': 5, 'Lemon': 1}
budget = 10

我想创建一些可以输出我可以购买的所有可能项目组合的东西。但是,必须制​​定以下规则:

  1. 每种水果我只能买 1 个
  2. 我必须买4个水果,不多不少
  3. 顺序无所谓。(即我不输出 [Apple Pear Orange Banana] 和 [Pear Apple Banana Orange],因为它们是相同的)
  4. 我必须保持在预算范围内。剩下的钱很好(如果有办法退回有多少剩余的钱,那就太酷了),但我不能超过 10。

我遵循了基本排列的示例并弄清楚了这一点,但我似乎无法弄清楚如何使用键值对和“预算”来做到这一点。任何帮助表示赞赏。谢谢!

标签: pythonloopsdictionaryiterationpermutation

解决方案


  1. 为方便起见,创建一个元组列表,例如 [ (Apple, 1), (Banana, 2) ]
  2. 创建所有 4 元组组合
  3. 只留下那些总和低于预算的人。
items = {'Apple': 1, 'Pear': 3, 'Orange': 2, 'Banana' : 4, 'Grape' : 3, 'Melon': 5, 'Lemon': 1}
budget = 10

tuples = items.items()

combos = list(itertools.combinations(tuples, 4))

combos_under_budget = [ t for t in combos if sum(p[1] for p in t) <= budget ]

combos_under_budget
>>> [(('Apple', 1), ('Pear', 3), ('Orange', 2), ('Banana', 4)),
 (('Apple', 1), ('Pear', 3), ('Orange', 2), ('Grape', 3)),
 (('Apple', 1), ('Pear', 3), ('Orange', 2), ('Lemon', 1)),
 (('Apple', 1), ('Pear', 3), ('Banana', 4), ('Lemon', 1)),
 (('Apple', 1), ('Pear', 3), ('Grape', 3), ('Lemon', 1)),
 (('Apple', 1), ('Pear', 3), ('Melon', 5), ('Lemon', 1)),
 (('Apple', 1), ('Orange', 2), ('Banana', 4), ('Grape', 3)),
 (('Apple', 1), ('Orange', 2), ('Banana', 4), ('Lemon', 1)),
 (('Apple', 1), ('Orange', 2), ('Grape', 3), ('Lemon', 1)),
 (('Apple', 1), ('Orange', 2), ('Melon', 5), ('Lemon', 1)),
 (('Apple', 1), ('Banana', 4), ('Grape', 3), ('Lemon', 1)),
 (('Apple', 1), ('Grape', 3), ('Melon', 5), ('Lemon', 1)),
 (('Pear', 3), ('Orange', 2), ('Banana', 4), ('Lemon', 1)),
 (('Pear', 3), ('Orange', 2), ('Grape', 3), ('Lemon', 1)),
 (('Orange', 2), ('Banana', 4), ('Grape', 3), ('Lemon', 1))]

推荐阅读