python - 在字典中查找产生一定总和的键组合
问题描述
我有一个dict
这样的:
a = {"a" : 1.04,
"b" : 1.07,
"c" : 10.99,
...}
我试图得到所有产生的组合,keys
可以重复。value
sum
x
keys
因此,例如,目标3.12
可能是["a", "a", "a"]
我写了这样的代码:
def combinations(data, target, result = [], partial_target = 0):
if partial_target == target:
yield result
if partial_target >= target:
return
for key, value in data.items():
yield from combinations(data, target, result + [key], partial_target + value)
list(combinations(a, 199.45))
但这一直在旋转而没有结果,我在阅读了这个答案后编辑了我的代码。所以我不确定它是否有效,或者它只是陷入了无限循环,如果没有,这是否是解决这个问题的最佳方法。
解决方案
如前所述,不要相信float
完全平等。但是,您可以使用math.isclose
:
import math
def combinations(data, target):
def inner(target, pool):
if math.isclose(0.0, target, abs_tol=0.00001):
yield []
return
if target < 0:
return
for i, key in enumerate(pool):
for c in inner(target - data[key], pool[i:]):
yield c + [key]
return inner(target, tuple(data.keys()))
推荐阅读
- php - 即使重新启动,Apache 也不会提供新文件
- docker - 在 Alpine Linux Docker 容器中构建 GNATCOLL
- kubernetes - 如何使用 kubernetes Horizontal Pod Autoscaler 控制降容容限
- php - Favicon PHP 缓存问题
- ruby-on-rails - 我的rails应用程序中的nil:NilClass的未定义方法`jobs'
- sql - 如何删除 PostgreSQL 中两个字符之间的字符串?
- ruby-on-rails - 创建带有测试环境启动的工厂
- powershell - 为什么在我进行文件更改并创建文件后,我的 Powersell 控制台反复显示“未启动”状态。(使用文件系统观察器)
- scala - spark submit-read 命令行参数,它是使用 Scop 和 ConfigFactory 的配置文件 [HOCON]
- c - 像不同版本的 gcc 一样编译 C