каков питонный способ подсчета появления элемента в списке? - PullRequest
9 голосов
/ 09 января 2009

это то, что я сделал. есть ли лучший способ в питоне?

for k in a_list:   
  if kvMap.has_key(k):
    kvMap[k]=kvMap[k]+1   
  else:
    kvMap[k]=1

Спасибо

Ответы [ 6 ]

15 голосов
/ 09 января 2009

Использовать defaultdict

from collections import defaultdict
kvmap= defaultdict(int)
for k in a_list:
    kvmap[k] += 1
9 голосов
/ 09 января 2009

Один элемент:

a_list.count(k)

Все элементы:

counts = dict((k, a_list.count(k)) for k in set(a_list))
7 голосов
/ 09 января 2009

Я не знаю, это в принципе выглядит нормально для меня. Ваш код прост и легок для чтения, что является важной частью того, что я считаю питоническим.

Вы можете немного подкорректировать это так:

for k in a_list:
     kvMap[k] = 1 + kvMap.get(k,0)
4 голосов
/ 27 декабря 2011

Такой старый вопрос, но, учитывая, что добавление к defaultdict(int) является таким распространенным использованием, неудивительно, что collections имеет специальное имя для этого (начиная с Python 2.7)

>>> from collections import Counter
>>> Counter([1, 2, 1, 1, 3, 2, 3, 4])
Counter({1: 3, 2: 2, 3: 2, 4: 1})
>>> Counter("banana")
Counter({'a': 3, 'n': 2, 'b': 1})
3 голосов
/ 10 января 2009

Другое решение использует setdefault ():

for k in a_list:
    kvMap[k] = kvMap.setdefault(k, 0) + 1
1 голос
/ 10 января 2009

Если ваш список отсортирован, альтернативным способом было бы использовать itertools.groupby . Возможно, это не самый эффективный способ, но, тем не менее, это интересно. Он возвращает значение элемента> количество:

>>> import itertools
>>> l = [1,1,2,3,4,4,4,5,5,6,6,6,7]
>>> dict([(key, len([e for e in group]))
          for (key, group)
          in itertools.groupby(l)])
{1: 2, 2: 1, 3: 1, 4: 3, 5: 2, 6: 3, 7: 1}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...