Python 如果字典的键在冻结集中,则检索值

Python 如果字典的键在冻结集中,则检索值,python,dictionary,set,key,frozenset,Python,Dictionary,Set,Key,Frozenset,我使用Frozenset保留字典的键,以利用并集、差集和交集运算。但是,当我试图通过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(n

我使用Frozenset保留字典的键,以利用并集、差集和交集运算。但是,当我试图通过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))
制作:

甚至:

print(newDict.get(stA))
print(newDict.get(stB))
print(newDict.get(stC))
print(newDict.get(stD))
制作:

如果您的键在Frozenset中,如何从字典中检索值?

感谢Martijn Pieters!答案是DVO(字典视图) 对象)和生成器表达式(如果要将结果添加到 名单


要创建冻结集关键点,您需要实际创建冻结集并将其用作关键点:

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

如果要查找集合交点,可以使用:

在Python3中,返回字典视图是默认设置;您可以在此处使用
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

你实际上可以做你想做的事情,至少在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

问题似乎是键被指定为字符串对象而不是冻结集,但搜索设置为查找冻结集

为什么你认为键是冻结集?Python字典不支持像这样的按集查找,不。你希望得到什么样的输出?是的,DVO(字典视图对象)发挥了神奇的作用,但交集的结果又是一个新的集:(因此我无法将此结果附加到我的列表:
aList.append(newDict.viewkeys()&stA)
@Michael:您可以扩展列表:
aList.extend(newDict.viewkeys()&stA)
。集合交集始终生成0个或多个元素,而不仅仅是1个。是的,但它将是一个字典键而不是字典值!我用粗体字标出的问题是:如何从字典中检索值…?更清楚地说,您不能编写
aList.append(newDict.get(newDict.viewkeys()&stA))
aList.extend(newDict.get(newDict.viewkeys()&stA))
也是不可能的:(这是我想要的全部。
aList.append(newDict[newDict.viewkeys()&stA])
从字典中通过键而不是dict.get()方法检索值也不起作用(可以使用生成器表达式:
aList.extend(newDict.viewkeys()和setA中的k的newDict[k]))
。我上面的例子是真实代码的简化版本(原型)。在我的例子中,我没有创建字典,我是从函数参数(命令行)接收字典的:
def foo(var,**kwDict)
。所以我不能使用您的建议,但无论如何也谢谢。
for key in newDict.keys() & stA:
    # all keys that are in the intersection of stA and the dictionary
>>> 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, '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