我有一个计数器,我想按以下方式排序:
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)
答案 0 :(得分:2)
Counter
是无序的。它们是dict
的子类,与dict
类似,不是有序的。说“排序Counter
”是没有意义的。您可以获取Counter
中按所需方式排序的项目列表,例如:
>>> 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)]
如果您想要一个有序的Mapping
类型,则必须使用内置的OrderedDict
,或者实现自己的class OrderedCounter(Counter, OrderedDict):
'Counter that remembers the order elements are first encountered'
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, OrderedDict(self))
def __reduce__(self):
return self.__class__, (OrderedDict(self),)
。我们可以使用多重继承来重用内置类来获得我们想要的东西。这是一个食谱straight from the docs:
>>> 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
>>>
所以,在行动中:
Counter
更重要的是,你应该考虑为什么你需要一个有序的class Foo {
multi method do-it { put "Default" }
multi method do-it ( Int $n ) { put "Int method" }
multi method do-it ( Str $s ) { put "Str method" }
multi method do-it ( Rat $r ) { put "Rat method" }
}
class Bar is Foo {
multi method do-it { put "Bar method" }
multi method do-it (*@a) { put "Bar slurpy method" }
}
Foo.new.do-it: 1;
Foo.new.do-it: 'Perl 6';
Foo.new.do-it: <1/137>;
Foo.new.do-it;
put '-' x 10;
Bar.new.do-it: 1;
Bar.new.do-it: 'Perl 6';
Bar.new.do-it: <1/137>;
Bar.new.do-it: 5+3i;
Bar.new.do-it;
...你真的需要一个吗?