0

我编写了以下代码来计算每个嵌入式字典中值的总和,对于每个嵌入式字典,我还想保留与这些值对应的键。正如您在下面看到的,例如,我想知道 20+30+40 = 90 但我还想保留键:loan1、loan2、loan3 并知道它们的值分别是 20、30、40 所以我可以创建一个新字典。

我已经写了三个 for 循环,我认为它可以更简洁地完成。此外,我已经运行了几次,而打印嵌入式字典值的 for 循环和记录嵌入式字典键的 for 循环每次都以相同的顺序迭代,我不确定我是什么有书面保证。

mydict = {'k1':{'loan1':20,'loan2':30, 'loan3':40},'k2':{'loan1':90,'loan2':65, 'loan3':75}}

for k in mydict.keys():

    the_sum = 0

    for c in mydict[k].itervalues():
        the_sum += c

        print k, c, the_sum

    for k2 in mydict[k].iterkeys():
        print k2

k2 75 75

k2 65 140

k2 90 230
loan3

loan2

loan1

k1 40 40

k1 30 70

k1 20 90

loan3

loan2

loan1
4

3 回答 3

2

你只是想让它打印总和吗?还是要将总和添加为字典中的新字段?如果您只想要给定键的总和,您可以执行以下操作:

In [1]: mydict = {'k1':{'loan1':20,'loan2':30, 'loan3':40},'k2':{'loan1':90,'loan2':65, 'loan3':75}}

In [2]: for k, v in mydict.iteritems():
   ...:     print k, sum(v.values())
   ...:
   ...:
k2 230
k1 90

并保留您的所有原始信息。如果要total为每个字段添加一个,可以执行以下操作:

In [3]: for k, v in mydict.iteritems():
   ...:     v['total'] = sum(v.values())
   ...:
   ...:

In [4]: mydict
Out[4]:
{'k1': {'loan1': 20, 'loan2': 30, 'loan3': 40, 'total': 90},
 'k2': {'loan1': 90, 'loan2': 65, 'loan3': 75, 'total': 230}}
于 2012-11-23T23:27:32.963 回答
1

如果您试图对每个键的贷款价值求和,您可以使用这样的字典理解

mydict = {'k1':{'loan1':20,'loan2':30, 'loan3':40},
          'k2':{'loan1':90,'loan2':65, 'loan3':75}}

totals = {key:sum(loans.values()) for key, loans in mydict.items()}
print(totals)

产量

{'k2': 230, 'k1': 90}

如果您使用的是 Python2.6 或更早版本,那么您可以totals使用列表推导来形成字典:

totals = dict((key,sum(loans.values())) for key, loans in mydict.items())
于 2012-11-23T23:27:48.067 回答
1

我不确定我是否完全理解你的问题。至于获取字典的总和,您可以用列表理解和 sum() 替换 for 循环

>>> mydict = {'k1':{'loan1':20,'loan2':30, 'loan3':40},'k2':{'loan1':90,'loan2':65, 'loan3':75}}
>>> sum([x for x in mydict['k1'].itervalues()])
90
>>> sum([x for x in mydict['k2'].itervalues()])
230

这确实使 mydict 保持不变,因此您的键/值被保留。python 字典也是无序的,如果你想保留键以便查看 python 的 collections.ordereddict

于 2012-11-23T23:29:22.047 回答