在嵌套字典中求和值

时间:2016-01-02 19:20:34

标签: python

我有一个嵌套的Python字典:

dct={1: {'13C': (13, 'C'), '6C': (6, 'C'), '13D': (13, 'D'), '10D': (10, 'D'), '7H': (7, 'H'), '5H': (5, 'H'), '5D': (5, 'D')}, 2: {'6C': (6, 'C'), '10D': (10, 'D'), '7H': (7, 'H'), '14D': (14, 'D'), '5H': (5, 'H'), '5D': (5, 'D'), '14C': (14, 'C')}}

我希望仅为每个子词典提取数字,确定最高的5个数字,然后对它们求和。到目前为止我的代码(我已尝试过许多变体以及对itertools中其他类似帖子的其他建议):

    for player in dct:
        print player
        print dct[player]
        for cards in dct[player].keys():
            print cards

期望的结果:

第一个和第二个条目的条目“5D”和“5H”是最低的(在这种情况下),因此它们不会包含在总和中。因此,第一个条目first=13+6+13+10+7second=6+10+7+14+14的结果。所以first=49second=51。怎么做这个计算?

5 个答案:

答案 0 :(得分:1)

您希望遍历所有子项,然后提取值。找到五个最高值,并总结:

>>> for key, subdictionary in dct.items():
        values = [x[0] for x in subdictionary.values()]
        values.sort(reverse=True)
        print(key, sum(values[:5]))

1 49
2 51

答案 1 :(得分:1)

如果你想要最大的n,你可以使用nlargest

from operator import itemgetter
from heapq import nlargest
n = 5

maxes = [(k, sum(nlargest(n, map(itemgetter(0), v.values())))) 
          for k, v  in dct.items()]

输出:

[(1, 49), (2, 51)]

或者如果你只想要总和:

maxes = [(sum(nlargest(n, map(itemgetter(0), v.values())))) 
          for v  in dct.values()]

哪会给你:

[49, 51]

答案 2 :(得分:0)

result = [sum(sorted([ int(x[:-1]) for x in dct[key]])[-5:]) for key in dct]

如果您还需要钥匙:

result = [(key, sum(sorted([int(x[:-1]) for x in dct[key]])[-5:])) for key in dct]

答案 3 :(得分:0)

你可以像这样提取数字

numbers = [sum(sorted([y[0] for x, y in v.iteritems()])[-5:]) for k, v in dct.iteritems()]
print numbers  # [49, 51]

答案 4 :(得分:0)

我这样做:

>>> {k:sum(sorted((x[0] for x in v.values()))[-5:]) for k,v in dct.items()}
{1: 49, 2: 51}