循环浏览多个不同大小的python字典

循环浏览多个不同大小的python字典,python,for-loop,dictionary,Python,For Loop,Dictionary,我从另一个类继承了以下两个python字典 >>> print init_treats {('001', 0): init_treat_001_0, ('001', 3): init_treat_001_3, ('001', 2): init_treat_001_2, ('002', 0): init_treat_002_0, ('002', 1): init_treat_002_1, ('002', 2): init_treat_002_2, ('002', 3): init

我从另一个类继承了以下两个python字典

>>> print init_treats
{('001', 0): init_treat_001_0, ('001', 3): init_treat_001_3, ('001', 2): init_treat_001_2, ('002', 0): init_treat_002_0, ('002', 1): init_treat_002_1, ('002', 2): init_treat_002_2, ('002', 3): init_treat_002_3, ('001', 1): init_treat_001_1}

>>> print init_untreats
{'002': init_untreat_002, '001': init_untreat_001}
如何生成以下内容?

init_treat_001_0 + init_treat_001_1 + init_treat_001_2 + init_treat_001_3 +
init_untreat_001 == 0


init_treat_002_0 + init_treat_002_1 + init_treat_002_2 + init_treat_002_3 + 
init_untreat_002 == 0

init\u treats
键进行排序:

treats = sorted(init_treats)
现在,您可以使用
itertools.groupby()
在密钥的第一部分对它们进行分组:

from itertools import groupby
from operator import itemgetter

for untreat, group in groupby(sorted(init_treats), itemgetter(0)):
    # group is now a sorted iterator of keys with the same first value
    if init_untreat[untreat] + sum(map(init_treats.get, group)) == 0:
        # sum of init_treat_n_m + init_untreat_n is 0
因为它使用排序,所以这是一个O(NlogN)解决方案(N是
init\u treats
dictionary的大小)

您可以将字典用于O(N+K)解决方案(K是
init\u untreats
dictionary的大小):


因为在你的例子中,K总是小于N,渐进地说,这当然是一个O(N)算法。

你的意思是你想把
init_treats.keys()…[0]
(元组键中的第一个元素)与
init_untreats
?@MartijnPieters是的,以便建立下面的方程。这是一个优化问题,我正试图建立一个方程来求解。在您的第二部分中,似乎SUMMES[untreats](对于n+1)覆盖了SUMMES[untreats]对于(n)的结果。还是我看错了?当我一步一步地看sums[treats]的结果时,我发现最终的结果是两个方程。当我退出循环时,返回SUMMES[treat],我只得到一个。@dassouki:
SUMMES
untreat
键对总和进行分组。因此,对于
init\u treats
字典中的所有
(untreat,id)
键,它们的值被汇总在键的
untreat
部分。如果您有两个不同的
untreat
键,则在该字典中可以得到两个和。谢谢,完美:)
sums = init_untreat.copy()
for untreat, id in init_treats:
    sums[untreat] += init_treats[untreat, id]

for untreat, total in sums.items():  # use sums.iteritems() in Python 2
    if total == 0:
        # sum of init_treat_n_m + init_untreat_n is 0