我有一个具有不同整数值的密钥字典,例如
d = {'a':1, 'b':12, 'c':33, 'd':40, 'e':15, 'f':6, 'g':27}
我希望能够返回组合值等于某个数字的键列表,例如
number = 55
result = ['d', 'e']
我不确定如何解决问题,或者我是否应该迭代地或递归地思考它。我在这一点上有点亏。 目前我正在使用Python 2.7,但也不介意在Python 3中看到解决方案。 说实话,即使是建议也会在现阶段受到赞赏。
答案 0 :(得分:0)
1)对字典进行排序以创建元组列表
2)现在,对于排序列表中的每个索引i
,找到索引j
sum-value_at_index_i
等于value_at_index_j
。
a= {'a':1, 'b':12, 'c':33, 'd':40, 'e':15, 'f':6, 'g':27}
# Lets sort it first
a_sort = sorted(a.items(),key=lambda x:x[1])
n=len(a)
i=j=flag=0
sum=55 #Input the sum from user
result = []
while i<n:
j=i+1
while j<n:
if (sum-a_sort[i][1]) == a_sort[j][1] :
result.append(a_sort[j][0])
result.append(a_sort[i][0])
flag=1
break
else:
j=j+1
if flag==1:
break
i=i+1
print result
输出:
['d', 'e']
答案 1 :(得分:0)
只要项目数量不是太大,你就可以强行执行:
import itertools
def matches(d, target):
# First try single items, then couples, then triplets etc.
for num in range(1,len(d)+1):
# Iterate over all possible combinations of length num
for com in itertools.combinations(d.items(), num):
# Does the sum of all second items per key/value pair match the target?
if sum(item[1] for item in com) == target:
# Yield one item at a time, so the caller can decide when to stop
yield com
您可以使用它来迭代所有匹配项:
>>> mydict = {'a':1, 'b':12, 'c':33, 'd':40, 'e':15, 'f':6, 'g':27}
>>> for match in matches(mydict,55):
... print(match)
...
(('d', 40), ('e', 15))
(('c', 33), ('e', 15), ('f', 6), ('a', 1))
(('b', 12), ('e', 15), ('g', 27), ('a', 1))
或在break
行后添加print()
,以使您的计划在第一场比赛停止。