我有一个嵌套的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+7
和second=6+10+7+14+14
的结果。所以first=49
和second=51
。怎么做这个计算?
答案 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}