如何对字典中的键进行排序,添加值并在组合值等于某个数字时返回键列表

时间:2014-09-17 06:08:30

标签: python dictionary

我有一个具有不同整数值的密钥字典,例如

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中看到解决方案。 说实话,即使是建议也会在现阶段受到赞赏。

2 个答案:

答案 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(),以使您的计划在第一场比赛停止。