В Python 3.6+ dict
теперь будет поддерживать порядок вставки.
Итак, вы можете:
words = ["oranges", "apples", "apples", "bananas", "kiwis", "kiwis", "apples"]
counter={}
for w in words: counter[w]=counter.get(w, 0)+1
>>> counter
{'oranges': 1, 'apples': 3, 'bananas': 1, 'kiwis': 2}
К сожалению, счетчик в Python 3.6 и 3.7 не отображает порядок вставки, который он поддерживает; вместо этого __repr__
сортирует результат по от наиболее распространенных до наименее распространенных.
Но вы можете использовать тот же рецепт OrderedDict, но просто используйте вместо этого Python 3.6+:
from collections import Counter
class OrderedCounter(Counter, dict):
'Counter that remembers the order elements are first encountered'
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, dict(self))
def __reduce__(self):
return self.__class__, (dict(self),)
>>> OrderedCounter(words)
OrderedCounter({'oranges': 1, 'apples': 3, 'bananas': 1, 'kiwis': 2})
Или, поскольку Counter является подклассом dict
, который поддерживает порядок в Python 3.6+, вы можете просто избежать использования __repr__
Counter, либо вызвав .items()
на счетчике, либо превратив счетчик обратно в dict
:
>>> c=Counter(words)
Это представление этого счетчика отсортировано по наиболее частым элементам до наименьшего и использует метод счетчиков __repr__
:
>>> c
Counter({'apples': 3, 'kiwis': 2, 'oranges': 1, 'bananas': 1})
Эта презентация соответствует встречному или порядку вставки:
>>> c.items()
dict_items([('oranges', 1), ('apples', 3), ('bananas', 1), ('kiwis', 2)])
Or,
>>> dict(c)
{'oranges': 1, 'apples': 3, 'bananas': 1, 'kiwis': 2}
person
dawg
schedule
14.07.2018