如何在Python中按字母顺序然后按值顺序对计数器排序
我有一个计数器,我想按以下方式排序:如何在Python中按字母顺序然后按值顺序对计数器排序,python,sorting,counter,Python,Sorting,Counter,我有一个计数器,我想按以下方式排序: Counter({'M': 9, 'L': 5, 'P': 5, 'S': 2, 'd': 1, 'T': 1}) 当我使用我的代码时,它给了我: Counter({'M': 9, 'P': 5, 'L': 5, 'S': 2, 'T': 1, 'd': 1}) 我尝试了sorted()函数,但当我使用它时,它的返回值不再是计数器 这是我的密码,你会怎么做 def most_encountered_letters(dictionnary): co
Counter({'M': 9, 'L': 5, 'P': 5, 'S': 2, 'd': 1, 'T': 1})
当我使用我的代码时,它给了我:
Counter({'M': 9, 'P': 5, 'L': 5, 'S': 2, 'T': 1, 'd': 1})
我尝试了sorted()函数,但当我使用它时,它的返回值不再是计数器
这是我的密码,你会怎么做
def most_encountered_letters(dictionnary):
counter = collections.Counter()
for line in dictionnary:
words = line.split(',')[0].split(' ')
for word in words:
counter[word[0]] += 1
print(counter)
return counter.most_common(5)
计数器
无序。它们是dict
的一个子类,与dict
一样,没有顺序。说“已排序的计数器
”没有意义。您可以在计数器
中按所需方式获得项目列表,例如:
>>> from collections import Counter
>>> c = Counter({'M': 9, 'L': 5, 'P': 5, 'S': 2, 'd': 1, 'T': 1})
>>> c
Counter({'M': 9, 'L': 5, 'P': 5, 'S': 2, 'T': 1, 'd': 1})
>>> sorted(c.items(), key= lambda t: (t[1], t[0]), reverse=True)
[('M', 9), ('P', 5), ('L', 5), ('S', 2), ('d', 1), ('T', 1)]
如果您想要有序的映射
类型,则必须使用内置的orderedict
,或者实现自己的映射。我们可以使用多重继承来重用内置类以获得我们想要的。这是一个食谱:
因此,在行动中:
>>> oc = OrderedCounter()
>>> for k,v in sorted(c.items(), key= lambda t: (t[1], t[0]), reverse=True):
... oc[k] = v
...
>>> oc
OrderedCounter(OrderedDict([('M', 9), ('P', 5), ('L', 5), ('S', 2), ('d', 1), ('T', 1)]))
>>> for k,v in oc.items():
... print(k,v)
...
M 9
P 5
L 5
S 2
d 1
T 1
>>>
更重要的是,你应该考虑为什么你需要一个命令<代码>计数器< /代码>…您真的需要吗?计数器无序。它们是
dict
的一个子类,与dict
一样,没有顺序。说“已排序的计数器
”没有意义。您可以在计数器
中按所需方式获得项目列表,例如:
>>> from collections import Counter
>>> c = Counter({'M': 9, 'L': 5, 'P': 5, 'S': 2, 'd': 1, 'T': 1})
>>> c
Counter({'M': 9, 'L': 5, 'P': 5, 'S': 2, 'T': 1, 'd': 1})
>>> sorted(c.items(), key= lambda t: (t[1], t[0]), reverse=True)
[('M', 9), ('P', 5), ('L', 5), ('S', 2), ('d', 1), ('T', 1)]
如果您想要有序的映射
类型,则必须使用内置的orderedict
,或者实现自己的映射。我们可以使用多重继承来重用内置类以获得我们想要的。这是一个食谱:
因此,在行动中:
>>> oc = OrderedCounter()
>>> for k,v in sorted(c.items(), key= lambda t: (t[1], t[0]), reverse=True):
... oc[k] = v
...
>>> oc
OrderedCounter(OrderedDict([('M', 9), ('P', 5), ('L', 5), ('S', 2), ('d', 1), ('T', 1)]))
>>> for k,v in oc.items():
... print(k,v)
...
M 9
P 5
L 5
S 2
d 1
T 1
>>>
更重要的是,你应该考虑为什么你需要一个命令<代码>计数器< /代码>…你真的需要一个吗?A
Counter
是一个Dict
子类,因此根据定义它是未排序的,如果你试图使用sorted()
它必须返回一个非Dict
类。您可以将结果移动到一个列表中。我想,但我的问题是“您为什么要排序?”,因为您的实际问题最好用另一种方式解决。最后,这是我的建议。顺便说一句,Python2.x还是3.x?在Python中,排序Dict
是没有办法的,唯一的办法就是仔细查看链接!你的“没有答案”彻底改变了你的问题,并使两个答案无效。还有,你的标题。你的标题说你想先按键排序,然后按值排序,但听起来你实际上想先按值排序,然后按键排序,这是相反的。计数器
是一个Dict
子类,因此根据定义它是未排序的,如果你试图使用sorted()
它必须返回一个非Dict
类。您可以将结果移动到一个列表中。我想,但我的问题是“您为什么要排序?”,因为您的实际问题最好用另一种方式解决。最后,这是我的建议。顺便说一句,Python2.x还是3.x?在Python中,排序Dict
是没有办法的,唯一的办法就是仔细查看链接!你的“没有答案”彻底改变了你的问题,并使两个答案无效。还有,你的标题。你的标题说你想先按键排序,然后按值排序,但听起来你实际上想先按值排序,然后按键排序,这是相反的。