То, что вы на самом деле просите, это понимание словаря, а не понимание списка.Они похожи, но синтаксис немного другой
# list comprehension
[foo for foo in stuff]
# dict comprehension
{key: val for key, val in some_tuple}
Проблема в том, что это не сработает для проблемы, которую вы пытаетесь решить.
Понимания работают как map
, где они создают новую коллекцию с каким-то образом преобразованным каждым элементом, или filter
, где существует новая коллекция с некоторыми элементами, которые могут быть удалены.Это операции без сохранения состояния.
Подсчет слов подразумевает отслеживание того, что вы уже видели.Это операция reduce
, при которой вы сохраняете состояние в какой-то другой структуре данных, counts
в вашем случае.
Как уже говорили другие ответы, collections.Counter
- это «правильный» способ решения этой проблемы.проблема.
С учетом всего сказанного, вот как использовать понимание списка для подсчета слов.Пожалуйста, не пытайтесь делать это дома (или на работе ... особенно не на работе ...)
>>> lorem_ipsum = """
... Lorem ipsum dolor sit amet, consectetur adipiscing elit.
... """ * 2
>>> result = {}
>>> words = lorem_ipsum.split()
>>> [result.update({word: result.get(word, 0) + 1}) for word in words]
[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]
>>> result
{'consectetur': 2, 'ipsum': 2, 'amet,': 2, 'adipiscing': 2, 'sit': 2, 'elit.': 2, 'dolor': 2, 'Lorem': 2}
Это работает, потому что понимание - это, в основном, цикл за кулисами, но вывсе еще обновляя переменную состояния и просто игнорируя фактический список, который создается.В этом случае он торгует увеличенным использованием памяти для удобства чтения, а не лучшим выбором.