Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/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 按值对dict排序_Python - Fatal编程技术网

Python 按值对dict排序

Python 按值对dict排序,python,Python,我从一堆或几封电子邮件中读取数据,并计算每个单词的频率。首先构造两个计数器: counters.stats = collections.defaultdict(dict) counters.chi = collections.counter() 统计的关键是单词。对于每个单词,我构造一个dict,其键是电子邮件的名称,值是该单词在该电子邮件中的频率 气的关键是与统计中的词相同。我想按“chi”中的键对“stats”中的键进行排序。该问题通过以下方法解决: def print_stats(cou

我从一堆或几封电子邮件中读取数据,并计算每个单词的频率。首先构造两个计数器:

counters.stats = collections.defaultdict(dict)
counters.chi = collections.counter()
统计的关键是单词。对于每个单词,我构造一个dict,其键是电子邮件的名称,值是该单词在该电子邮件中的频率

气的关键是与统计中的词相同。我想按“chi”中的键对“stats”中的键进行排序。该问题通过以下方法解决:

def print_stats(counters):
    sorted_key = sorted(counters.stats, key = counters.chi.get)
    result = collections.OrderedDict(k, counters.stats[k] for key in sorted_key)
        for form, cat_to_stats in result.items():

如果我理解正确,这应该满足您的要求:

>>> stats = {'a':   {'email1':4, 'email2':3}, 
...          'the': {'email1':2, 'email3':4},
...          'or':  {'email1':2, 'email3':1}}
>>> chi = {'a': 7, 'the':6, 'or':3}
>>> sorted(stats, key=chi.get)
['or', 'the', 'a']
让我知道这是否适合你。另外,正如上面提到的BUWD,您应该考虑<代码> NoMPy <代码> >代码> SCIPY ,这可能会提供更好的性能,并且肯定会提供很多内置的功能。 既然您说这不起作用——由于您尚未解释的原因——这里有一个关于如何使用
key
参数的更一般的示例。这说明了
get
计数器
对象以及标准dict一起工作,但也说明了如何创建执行以下操作的函数:

>>> stats = {'a':   {'email1':4, 'email2':3}, 
...          'the': {'email1':2, 'email3':4},
...          'or':  {'email1':2, 'email3':1}}
>>> wordlists = ([k] * sum(d.itervalues()) for k, d in stats.iteritems())
>>> chi = collections.Counter(word for seq in wordlists for word in seq)
>>> sorted(stats, key=chi.get)
['or', 'the', 'a']
>>> sorted(stats, key=lambda x: chi[x] + 3)
['or', 'the', 'a']
>>> sorted(stats, key=chi.get, reverse=True)
['a', 'the', 'or']
我仍然不完全理解你在寻找什么,但也许你是想得到一个键、值元组的排序列表

>>> sorted(stats.iteritems(), key=lambda x: chi[x[0]])
[('or', {'email3': 1, 'email1': 2}), 
 ('the', {'email3': 4, 'email1': 2}), 
 ('a', {'email2': 3, 'email1': 4})]
实际上,我建议将其拆分:

>>>> sorted_keys = sorted(stats, key=chi.get)
>>>> [(k, stats[k]) for k in sorted_keys]
[('or', {'email3': 1, 'email1': 2}), ('the', {'email3': 4, 'email1': 2}), ('a', {'email2': 3, 'email1': 4})]
你说你想要一些按照chi中的值排序的东西,但是“与stats具有相同的结构”。这是不可能的,因为字典没有顺序;最接近的是元组排序列表,或
OrderedDict
(在2.7+中)


如果你必须经常对字典重新排序,这种方法是没有意义的

你的特定问题在旁边,如果你需要CISQUAL统计,你可以考虑<代码> SCISPY <代码>包,模块<代码> SISPY。STATS >代码> CISQUARE函数是一个优雅的解决方案,我必须说。p、 我无法安装numpy/scipy。有什么建议吗@senderleis是否获得内置函数?我不能用它。@user1325302,你什么意思?这是一种内置的
计数器
对象方法,它几乎完全执行
计数器对象[key]
的操作,但如果该键不存在,则不会抛出
键错误。当你说“我不能使用它”时,你是什么意思?@user1325302,你已经说过两次它不起作用了,但没有解释它怎么不起作用。正如您所看到的,在上面的代码中,它工作得非常完美。当你尝试这个时会发生什么?编辑你的问题,这样我才能真正回答它。
>>>> collections.OrderedDict((k, stats[k]) for k in sorted_keys)
OrderedDict([('or', {'email3': 1, 'email1': 2}), ('the', {'email3': 4, 'email1': 2}), ('a', {'email2': 3, 'email1': 4})])