Ініціалізація словника на python зі значенням ключа і без відповідних значень


76

Мені було цікаво, чи є спосіб ініціалізувати словник у python ключами, але ніяких відповідних значень поки я їх не встановлю. Як от:

Definition = {'apple': , 'ball': }

а потім пізніше я можу встановити їх:

Definition[key] = something

Я хочу лише ініціалізувати ключі, але я не знаю відповідних значень, поки мені не доведеться їх встановлювати пізніше. В основному я знаю, які ключі я хочу додати значення, як вони знайдені. Дякую.


1
Чому ви хочете ініціалізувати ключі?
Seçkin Savaşçı

6
Не існує такого поняття, як ключ без значення в дикті. Однак ви можете просто встановити значення None.
BrenBarn

Що означає визначення ключа без значення? Якщо ви спробуєте отримати доступ до цього елементу, чи він видасть помилку (як ніби ви ніколи не визначали цей ключ), або щось видасть (у цьому випадку це щось має значення)?
Скотт Хантер,

Оскільки ви знаєте, що згодом заміните значення, насправді не має значення, на що ви їх встановили.
Марк Ренсом

Я створював словник, який проходить через інший словник, щоб захопити лише значення ключів, які я хотів, тому я хотів мати можливість порівняти ключі, а потім встановити їх, якщо вони рівні. Можливо, це був поганий спосіб, але це працює! Знову дякую!
користувач2989027

Відповіді:


65

Ви можете їх ініціалізувати None.


5
Або якщо None є допустимим значенням для одного або кількох ваших кортежів ключ-значення, ви можете використовувати щось на зразок "SENTINEL = object ()" і використовувати SENTINEL як своє сторожове значення, тестуючи з "is" замість "==".
Дстремберг

Так, погодились. Подивіться на загальний обсяг даних і визначте, яке значення ніколи не повинно бути доступним. -1, false, none, random int, random string і так далі .. Старе питання, але головний результат все-таки.
Angry 84,

Використання Noneпризведе до 'NoneType' object does not support item assignmentпомилки ...
Маркус

1
@Markus: Така помилка могла б статися при спробі зробити щось на зразок Definition[key] = somethingколи Definitionє None(що не є тим, що тут відстоюється), а не коли Definition[key]є None(що є).
Скотт Хантер,

91

Використовуйте fromkeysфункцію для ініціалізації словника з будь-яким значенням за замовчуванням. У вашому випадку ви ініціалізуєте з, Noneоскільки ви не маєте на увазі значення за замовчуванням.

empty_dict = dict.fromkeys(['apple','ball'])

це ініціалізується empty_dictяк:

empty_dict = {'apple': None, 'ball': None}

Як альтернативу, якщо ви хочете ініціалізувати словник із значенням за замовчуванням, відмінним від None, ви можете зробити:

default_value = 'xyz'
nonempty_dict = dict.fromkeys(['apple','ball'],default_value)

6
Використовуючи dict.fromkeys (..., default_value), переконайтесь, що default_value не має типу, який вимагає конструктора (наприклад, список), інакше ви отримаєте посилання на той самий об'єкт у всіх сегментах.
Антон Теодор

10

ви можете використати вирок за замовчуванням. Це дозволить вам встановлювати значення словника, не турбуючись, якщо ключ уже існує. Якщо ви отримаєте доступ до ключа, який ще не ініціалізований, він поверне вказане вами значення (у наведеному нижче прикладі він поверне None)

from collections import defaultdict
your_dict = defaultdict(lambda : None)

8

Було б добре знати, яка ваша мета, чому ви хочете ініціалізувати ключі в першу чергу. Я не впевнений, що вам взагалі потрібно це робити.

1) Якщо ви хочете підрахувати кількість повторень ключів, ви можете просто зробити:

Definition = {}
# ...
Definition[key] = Definition.get(key, 0) + 1

2) Якщо ви хочете отримати None (або якесь інше значення) пізніше для ключів, з якими ви не зіткнулися, знову можна просто використовувати метод get ():

Definition.get(key)  # returns None if key not stored
Definition.get(key, default_other_than_none)

3) Для всіх інших цілей ви можете просто використати список очікуваних ключів і перевірити, чи знайдені ключі згодом відповідають цим.

Наприклад, якщо ви хочете зберігати значення лише для цих ключів:

expected_keys = ['apple', 'banana']
# ...
if key_found in expected_keys:
    Definition[key_found] = value

Або якщо ви хочете переконатися, що всі очікувані ключі знайдені:

assert(all(key in Definition for key in expected_keys))

4

Ви можете ініціалізувати значення як порожні рядки і заповнити їх пізніше, коли вони знайдуться.

dictionary = {'one':'','two':''}
dictionary['one']=1
dictionary['two']=2


1

Розуміння може бути також зручним у цьому випадку:

# from a list
keys = ["k1", "k2"]
d = {k:None for k in keys}

# or from another dict
d1 = {"k1" : 1, "k2" : 2}
d2 = {k:None for k in d1.keys()}

d2
# {'k1': None, 'k2': None}

0

На основі уточнюючого коментаря @ user2989027, я думаю, хорошим рішенням є наступне:

definition = ['apple', 'ball']
data = {'orange':1, 'pear':2, 'apple':3, 'ball':4}
my_data = {}
for k in definition:
  try:
    my_data[k]=data[k]
  except KeyError:
    pass
print my_data

Я намагався тут не робити нічого вигадливого. Я налаштовую свої дані та порожній словник. Потім я переглядаю список рядків, що представляють потенційні ключі в моєму словнику даних. Я копіюю кожне значення з даних у my_data, але розглядаю випадок, коли дані можуть не мати ключа, який я хочу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.