Подтвердить что ты не робот

Вставка в словарь python

Поведение по умолчанию для словаря python - это создать новый ключ в словаре, если этот ключ еще не существует. Например:

d = {}
d['did not exist before'] = 'now it does'

все это хорошо и полезно для большинства целей, но что, если я хочу, чтобы python ничего не делал, если ключ еще не находится в словаре. В моей ситуации:

for x in exceptions:
    if masterlist.has_key(x):
        masterlist[x] = False

Другими словами, я не хочу, чтобы некоторые неправильные элементы в исключениях повреждали мой главный список. Это так просто, как это получается? он ЧУВСТВУЕТ, как я должен быть в состоянии сделать это в одной строке внутри цикла for (т.е. без явной проверки того, что x является ключом главного списка)

UPDATE: Для меня в моем вопросе возникает вопрос о отсутствии параллели между списком и диктоном. Например:

l = []
l[0] = 2 #fails
l.append(2) #works

с ответом подкласса, вы можете изменить словарь (возможно, "safe_dict" или "explicit_dict", чтобы сделать что-то подобное:

d = {}
d['a'] = '1' #would fail in my world
d.insert('a','1') #what my world is missing
4b9b3361

Ответ 1

Вы можете наследовать класс dict, переопределить его __setitem__, чтобы проверить наличие ключа (или сделать то же самое с установкой обезьяны только один экземпляр).

Пример класса:

class a(dict):
    def __init__(self, *args, **kwargs):
        dict.__init__(self, *args, **kwargs)
        dict.__setitem__(self, 'a', 'b')

    def __setitem__(self, key, value):
        if self.has_key(key):
          dict.__setitem__(self, key, value)

a = a()
print a['a'] # prints 'b'
a['c'] = 'd'
# print a['c'] - would fail
a['a'] = 'e'
print a['a'] # prints 'e'

Вы также можете использовать некоторую функцию для создания значений настроек, не проверяя существование проще.
Однако, хотя это было бы короче... Не используйте его, если вам это нужно во многих местах.

Ответ 2

Вы можете использовать .update:

masterlist.update((x, False) for x in exceptions if masterlist.has_key(x))

Ответ 3

Вы также можете использовать in вместо has_key, что немного приятнее.

for x in exceptions:
    if x in masterlist:
        masterlist[x] = False

Но я не вижу проблемы с наличием инструкции if для этой цели.

Ответ 4

Для длинных списков попробуйте использовать оператор & с функцией set(), охваченной ():

    for x in (set(exceptions) & set(masterlist)):
        masterlist[x] = False
        #or masterlist[x] = exceptions[x]

Он будет улучшать чтение и итерации одновременно, читая только ключи мастер-списка.