Ответ 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})
Я новичок в Python, и у меня есть простой вопрос, скажем, у меня есть список элементов:
['apple','red','apple','red','red','pear']
Самый простой способ добавить элементы списка в словарь и подсчитать, сколько раз элемент появляется в списке.
Итак, для списка выше я хотел бы, чтобы результат был:
{'apple': 2, 'red': 3, 'pear': 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})
Мне нравится:
counts = dict()
for i in items:
counts[i] = counts.get(i, 0) + 1
.get позволяет указать значение по умолчанию, если ключ не существует.
>>> 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})
Просто используйте свойство списка свойств \
i = ['apple','red','apple','red','red','pear']
d = {x:i.count(x) for x in i}
print d
вывод: {'pear': 1, 'apple': 2, 'red': 3}
Я всегда думал, что для задачи, которая тривиальна, я бы не хотел ничего импортировать. Но я могу ошибаться, в зависимости от коллекций. Сценарий быстрее или нет.
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 может искать всю вещь на каждой итерации. Я использовал этот метод для анализа многих мегабайт статистических данных, и он всегда был достаточно быстрым.
Рассмотрим коллекции .Counter(доступно с python 2.7 и далее). https://docs.python.org/2/library/collections.html#collections.Counter
Как насчет этого:
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}
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}