在python中排序和总结字典

时间:2014-09-06 10:48:17

标签: python sorting

我想规范化有向图。目前我这样做:

def normalize_distribution(in_degree_dist):
    '''
    normalize the distribution so all values sum up to 1
    '''
    # calcuate normalization factor
    factor=1.0/sum(in_degree_dist.itervalues())

    # sort the dictionary
    sorted_in_degree_dist = OrderedDict(sorted(in_degree_dist.iteritems(), key= lambda srt: srt[0]))

    # apply the factor to every value
    for key in sorted_in_degree_dist:
        sorted_in_degree_dist[key] *= factor
    return sorted_in_degree_dist

我发现我做了一次迭代太多了。迭代字典键时,我可以总结这些值。所以如果图表变大,我只会做一次迭代,而不是两次巨大的保护。

所以我用自己的函数替换了lambda。但是排序很聪明,因此关键功能不会被调用到每个元素上,这对于排序是必要的。

def sort_sum(*args, **kwargs):
    '''
    Sorting and summing up
    '''
    print args
    return args[0][0]

对于n = 20个节点且p = 0.5的图形,输出为:

Random graph with 20 nodes and probability 0.5 created.
Degree distribution calculated.
((4, 1),)
((8, 4),)
((9, 1),)
((10, 5),)
((11, 4),)
((12, 3),)
((13, 1),)
((14, 1),)
Degree distribution normalized.

只有8个调用20个元素,这对排序有好处,但对求和不利。

我想到列表理解来做到这一点

[key, val for key, val in in_degree_distribuion.iteritems()]

但我无法弄清楚如何总结。

我是否必须编写自己的排序和求和算法才能一步完成?

1 个答案:

答案 0 :(得分:0)

你总是可以在排序时(恰好在真正之后)应用乘法因子,而不是总和。

例如

# calcuate normalization factor
factor = 1.0 / sum(in_degree_dist.itervalues())

# sort the dictionary
sorted_in_degree_dist = OrderedDict((key, in_degree_dist[key] * factor)
    for key in sorted(in_degree_dist))

# or 
sorted_in_degree_dist = OrderedDict((key, value * factor)
    for key, value in sorted(in_degree_dist.iteritems()))