Python 2.7.14: «+ = 1 к элементу словаря, если ключ существует, иначе = 1» синтаксис не работает - PullRequest
0 голосов
/ 28 октября 2018

Я пытаюсь + = 1 к элементу в словаре, если он существует, иначе создайте ключ в словаре и установите его на 1. Я знаю, что могу использовать более одной строки логики для этого, но я очень хочу посмотреть, возможно ли сохранить логику в одной строке. Вот что я пытаюсь сделать:

myDict = {}
myDict[100] += 1 if 100 in myDict else 1

Выдает KeyError, хотя, если ключ 100 не существует. Как я могу установить однолинейную логику, чтобы установить ключ 100 на 1? Это вообще возможно?

Большое спасибо

Ответы [ 5 ]

0 голосов
/ 28 октября 2018

В дополнение к collection.Counter есть collection.defaultdict, который позволяет вам установить значение по умолчанию, которое будет использоваться при передаче неинициализированного ключа в dict. Конечно, для счетчиков это излишне, но в других ситуациях это может быть действительно замечательно.

0 голосов
/ 28 октября 2018

Вы индексируете уже в значении, поэтому выдается ошибка, если не указано. Это будет работать

if 100 in mydict:
    mydict[100] += 1
else:
    mydict[100] = 1

Однако даже красивее будет mydict[100] = mydict.get(100, 0) + 1

0 голосов
/ 28 октября 2018
myDict[100] = myDict[100]+1 if 100 in myDict else 1

или, может быть, лучше:

myDict.setdefault(100, 0)
myDict[100] +=1
0 голосов
/ 28 октября 2018

Проблема в том, что это анализируется как

myDict[100] += (1 if 100 in myDict else 1)

, что аналогично написанию

myDict[100] += 1

и, конечно, требуется, чтобы myDict[100] уже существовал. Вместо этого вы можете использовать обычное присваивание и метод словаря get, который позволяет вам указать, что должно быть возвращено, если ключа еще нет:

myDict[100] = myDict.get(100, 0) + 1

Или вы можете использовать collections.Counter, словарь специального назначения, предназначенный именно для этой работы:

import collections
myDict = collections.Counter()
myDict[100] += 1
0 голосов
/ 28 октября 2018

Использование get :

my_dict = {}
my_dict[100] =  my_dict.get(100, 0) +  1

Вывод

{100: 1}

Пояснение (издокументация)

Возвращает значение ключа, если ключ находится в словаре, иначе значение по умолчанию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...