如果我对您的理解正确,这应该可以满足您的要求:
>>> 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']
让我知道这是否适合您。此外,正如上面提到的 Boud,您应该考虑numpy
/ scipy
,它可能会提供更好的性能 - 并且肯定会提供许多内置功能。
既然你说这不起作用——由于你还没有解释的原因——这里有一个更一般的例子来说明如何使用这个key
参数。这表明它get
适用于Counter
对象以及标准字典,还表明如何创建一个执行某些操作的函数:
>>> 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
,但“与统计数据具有相同的结构”。这是不可能的,因为字典没有顺序;最接近的是元组的排序列表,或OrderedDict
(在 2.7+ 中)。
>>>> 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})])
如果您必须经常重新排序字典,则此方法毫无意义。