Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python对词典进行排序和汇总_Python_Sorting - Fatal编程技术网

用python对词典进行排序和汇总

用python对词典进行排序和汇总,python,sorting,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

我想规范化一个有向图。目前我正在这样做:

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。但是排序有点智能,所以不会对排序所需的每个元素调用key函数

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()]
但我不知道如何总结


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

您可以在排序时应用乘法因子,而不是进行求和

例如


如果您担心速度,那么根本不要为
sorted()
提供键函数。默认情况下是按字典顺序排序,这将给出所需的结果。键函数的函数调用开销比额外的迭代时间要糟糕得多。也就是说,为什么要进行排序?文档字符串和你的解释都说你想要标准化,这不需要排序。我正在排序,因为我想在以后绘制数据。对不起,我没提这个。谢谢你,我只是忽略了这个。我是如此执着于排序和求和,以至于我没有想到排序和标准化。在这种情况下,最少需要两次迭代。这并没有减少迭代次数,仍然是3次:一次用于
sum()
,一次用于
sorted()
,一次用于生成器表达式。我怀疑它是否比没有关键参数的原始代码快。它不会减少迭代次数,不会。但是,生成器/理解比显式循环快。不过不多。
# 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()))