Как запретить функции добавлять повторяющиеся ключи в словарь в python - PullRequest
0 голосов
/ 15 января 2020

Позвольте быть ниже функция ниже. Функция построчно извлекает элементы из файла и добавляет их в словарь (каждая строка имеет ключ и значение).

with open("archive.txt") as f:
      for line in f:
         (key, val) = line.split()
          dictionary[key] = val

Пример: Пусть будет следующий файл .txt:

aaa 111
bbb 222
aaa 333
ccc 444

Вставьте следующий текст:

dictionary = ['aaa':111, 'bbb':222, 'aaa':333, 'ccc':444]

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

dictionary = ['aaa':111, 'bbb':222, 'ccc':444]

Как предотвратить вставку дубликата ключа?

Ответы [ 2 ]

3 голосов
/ 15 января 2020

Если вы хотите всегда сохранять первое значение, связанное с данным ключом, простой трюк состоит в том, чтобы использовать setdefault, чтобы установить значение только , если ключ не уже существует:

with open("archive.txt") as f:
    for line in f:
        key, val = line.split()
        dictionary.setdefault(key, val)

dictionary.setdefault(key, val) по существу эквивалентно более многословному:

if key not in dictionary:
     dictionary[key] = val

хотя (по крайней мере на CPython, хотя не обязательно все чередуются интерпретаторы) первым является atomi c (когда ключ является встроенным типом, например, str в этом случае), а вторым - нет (два потока могут оба выполнить тест, не найти такого ключа, затем обе вставки в произвольном порядке, и оба потока будут считать, что они установили значение, даже если победит только вторая записываемая секунда).

Если вы хотите сохранить значение last , то вы хотите, тогда ваш оригинальный код уже в порядке; dict s хранит только одну копию ключа, поэтому заменяет связанное значение, если оно переназначено, поэтому ваш исходный код сохраняет только последнее значение.

0 голосов
/ 15 января 2020

Проверьте, содержит ли словарь ключ, прежде чем перезаписывать ключ / значение, которое уже существует

with open("archive.txt") as f:
  for line in f:
     (key, val) = line.split()
     if key not in dictionary:
         dictionary[key] = val
...