Python: использование словаря для подсчета элементов в списке

Я новичок в Python, и у меня есть простой вопрос, скажем, у меня есть список элементов:

['apple','red','apple','red','red','pear']

Самый простой способ добавить элементы списка в словарь и подсчитать, сколько раз элемент появляется в списке.

Итак, для списка выше я хотел бы, чтобы результат был:

{'apple': 2, 'red': 3, 'pear': 1}

Ответ 1

в 2.7 и 3.1 для этой цели существует специальный Counter dict.

>>> from collections import Counter
>>> Counter(['apple','red','apple','red','red','pear'])
Counter({'red': 3, 'apple': 2, 'pear': 1})

Ответ 2

Мне нравится:

counts = dict()
for i in items:
  counts[i] = counts.get(i, 0) + 1

.get позволяет указать значение по умолчанию, если ключ не существует.

Ответ 3

>>> L = ['apple','red','apple','red','red','pear']
>>> from collections import defaultdict
>>> d = defaultdict(int)
>>> for i in L:
...   d[i] += 1
>>> d
defaultdict(<type 'int'>, {'pear': 1, 'apple': 2, 'red': 3})

Ответ 4

Просто используйте свойство списка свойств \

i = ['apple','red','apple','red','red','pear']
d = {x:i.count(x) for x in i}
print d

вывод: {'pear': 1, 'apple': 2, 'red': 3}

Ответ 5

Я всегда думал, что для задачи, которая тривиальна, я бы не хотел ничего импортировать. Но я могу ошибаться, в зависимости от коллекций. Сценарий быстрее или нет.

items = "Whats the simpliest way to add the list items to a dictionary "

stats = {}
for i in items:
    if i in stats:
        stats[i] += 1
    else:
        stats[i] = 1

# bonus
for i in sorted(stats, key=stats.get):
    print("%d×'%s'" % (stats[i], i))

Я думаю, что это может быть предпочтительнее использовать count(), потому что он будет переходить только через итерируемый один раз, тогда как count может искать всю вещь на каждой итерации. Я использовал этот метод для анализа многих мегабайт статистических данных, и он всегда был достаточно быстрым.

Ответ 7

Как насчет этого:

src = [ 'one', 'two', 'three', 'two', 'three', 'three' ]
result_dict = dict( [ (i, src.count(i)) for i in set(src) ] )

В результате получается

{'one': 1, 'three': 3, 'two': 2}

Ответ 8

L = ['apple','red','apple','red','red','pear']
d = {}
[d.__setitem__(item,1+d.get(item,0)) for item in L]
print d 

Дает {'pear': 1, 'apple': 2, 'red': 3}