1

我正在使用 freezesets 来保留我的字典的键,以利用联合、差异和交叉操作。但是当我试图通过 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

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

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

4

3 回答 3

2

如果要查找设置的交叉点,可以使用字典视图对象

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
于 2015-04-05T15:57:04.977 回答
1

要创建冻结集键,您需要实际创建冻结集并将它们用作键:

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

测试:

>>> {frozenset('a'):1}[frozenset('a')]
1
于 2015-04-05T15:52:16.357 回答
0

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

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

于 2017-04-25T19:44:02.310 回答