【问题标题】:Retrieving values if keys of the dictionary are in frozensets如果字典的键在冻结集中,则检索值
【发布时间】:2015-06-10 03:10:03
【问题描述】:

我正在使用 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(字典视图 对象)和生成器表达式(如果要将结果添加到 一个列表()

【问题讨论】:

  • 为什么你认为键是冻结集?
  • Python 字典不支持这样的集合查找,不。
  • 您期望的输出是什么?

标签: python dictionary set key frozenset


【解决方案1】:

你可以使用dictionary view objects如果你想寻找设置交叉点

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

【讨论】:

  • 是的,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[k] for k in newDict.viewkeys() & setA)
【解决方案2】:

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

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

测试:

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

【讨论】:

  • 我上面的例子是真实代码的简化版(原型)。就我而言,我没有创建字典,而是从函数参数(命令行)接收它:def foo(var, **kwDict)。所以我不能使用你的建议,但无论如何也要感谢。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-23
    • 2022-07-12
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多