迭代嵌入字典的键和值

时间:2012-11-23 23:20:14

标签: python dictionary loops key-value

我编写了以下代码来计算每个嵌入字典中值的总和,并且对于每个嵌入字典,我还希望保留与这些值对应的键。正如你在下面看到的,例如,我想知道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

3 个答案:

答案 0 :(得分: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}}

答案 1 :(得分:1)

如果您尝试将每个密钥的贷款价值相加,可以使用dict comprehension这样的代码:

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或更早版本,那么您可以使用list comprehension来形成字典totals

totals = dict((key,sum(loans.values())) for key, loans in mydict.items())

答案 2 :(得分: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