Получение значений, если ключи словаря находятся в frozensets

Я использую frozensets, чтобы сохранить ключи моего словаря, чтобы использовать преимущества операций объединения, разности и пересечения. Но когда я пытаюсь извлечь значения по ключам из словаря через dict.get(), это возвращает значение None.

newDict = {'a': 1, 'b': 2, 'c': 3, 'd': True}
stKeys = set(newDict)
stA = frozenset('a')
stB = frozenset('b')
stC = frozenset('c')
stD = frozenset('d')

print(stKeys)
print(newDict.get(stA & stKeys))
print(newDict.get(stB & stKeys))
print(newDict.get(stC & stKeys))
print(newDict.get(stD & stKeys))

Производить:

>>>None
>>>None
>>>None
>>>None

И даже:

print(newDict.get(stA))
print(newDict.get(stB))
print(newDict.get(stC))
print(newDict.get(stD))

Производить:

>>>None
>>>None
>>>None
>>>None

Как извлечь значения из словаря, если ваши ключи находятся в frozensets?

Спасибо Мартейн Питерс! Ответ - DVO (объекты просмотра словаря) и выражение генератора, если вы хотите добавить результат в список ()

3 ответа

Решение

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

for key in newDict.viewkeys() & stA:
    # all keys that are in the intersection of stA and the dictionary

В Python 3 возвращение представлений словаря по умолчанию; ты можешь использовать newDict.keys() Вот:

for key in newDict.keys() & stA:
    # all keys that are in the intersection of stA and the dictionary

Демо на Python 3:

>>> newDict = {'a': 1, 'b': 2, 'c': 3, 'd': True}
>>> stA = frozenset('a')
>>> stB = frozenset('b')
>>> stC = frozenset('c')
>>> stD = frozenset('d')
>>> newDict.keys() & stA
{'a'}
>>> for key in newDict.keys() & stA:
...     print(newDict[key])
... 
1

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

newDict = {
    frozenset('a'): 1,
    frozenset('b'): 2,
    frozenset('c'): 3,
    frozenset('d'): True
}

Тестовое задание:

>>> {frozenset('a'):1}[frozenset('a')]
1

Вы действительно можете делать то, что пытаетесь сделать, по крайней мере, в 3.6.1, и я подозреваю, что 2.7.x также:

newDict = {frozenset('a'): 1, frozenset('b'): 2, frozenset('c'): 3, 'd': True}
stKeys = set(newDict)
stA = frozenset('a')
print(stA)
stB = frozenset('b')
stC = frozenset('c')
stD = 'd'

print(newDict[stA])
print(newDict[stB])
print(newDict[stC])
print(newDict[stD])

Выход:

frozenset({'a'})
1
2
3
True

Кажется, проблема в том, что ключ был назначен как строковый объект, а не как фрозенцет, но поиск был настроен на поиск фрозенцет.

Другие вопросы по тегам