如何重写循环列表理解

时间:2014-09-03 04:39:45

标签: python

我想知道是否有办法重新编写以下代码来列出理解。谢谢

inputDict是一个词典

result = {}
for key in inputDict:
    total = 0
    for nodes in inputDict :
        total = total + (key in inputDict[nodes])
    result.update({key : total})

2 个答案:

答案 0 :(得分:1)

如果我理解你的话,你可以尝试:

result = dict((key, sum(key in inputDict[nodes] for nodes in digraph)) for key in inputDict)

或者如果您需要一个清单:

result = [(key, sum(key in inputDict[nodes] for nodes in digraph)) for key in inputDict]

或者:

result = [(key, sum(key in vals for nodes in digraph)) for key, vals in inputDict]

答案 1 :(得分:1)

不是列表理解,因为您没有构建列表。但是,您尝试执行的操作(似乎计算链接到每个节点的节点数)可以通过使用collections.Counter来计算每个节点在{{1}的值中出现的次数,从而轻松完成}}:

inputDict

itertools.chain接受import collections import itertools result = collections.Counter(itertools.chain.from_iterable(inputDict.values())) 并将其中的所有节点列表分成一个大迭代器。 (或许那些是节点集。很难说。)collections.Counter然后计算它看到每个元素的次数。结果是inputDict.values()实例,其行为大多类似于dict。但是,存在一些差异,因此如果您需要的结果完全属于collections.Counter类型,则可以在其上调用dict

dict

请注意,对于不在计数器中的项目,result = dict(result) 会返回0,但Counter不会这样做。如果您在其上调用dict,则可能需要为从未在dict中出现的节点填写0的计数。


使用inputDict.values()Counter可以隐藏这里发生的一些事情,所以这里是你如何在不导入库代码的情况下编写的:

chain

没有一种简单的方法可以在没有算法复杂性牺牲的情况下将其转化为理解,这是result = {} # Initialize counts to 0, to make sure nodes that don't appear in the values have the # right count and to make sure we don't need to check `if node in result` later. for node in inputDict: result[node] = 0 # Go through and count node occurrences. for adjacent_nodes in inputDict.values(): for node in adjacent_nodes: result[node] += 1 存在的原因的一部分。