Получение значений, если ключи словаря находятся в 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
Кажется, проблема в том, что ключ был назначен как строковый объект, а не как фрозенцет, но поиск был настроен на поиск фрозенцет.