【问题标题】:Defaultdict return key as default [duplicate]Defaultdict返回键作为默认值[重复]
【发布时间】:2021-12-30 22:27:29
【问题描述】:

假设您在下面定义了一个名为 mydict 的 dict,并且您寻找一个名为 'D' 的键。

mydict = {'A':'a',
          'B':'b',
          'C':'c'}
mydict['D']

所需的输出应该是“D”,即您输入的确切输出。有没有办法用默认字典做到这一点?

【问题讨论】:

  • x = myDict.get('D', 'D') ?
  • defaultdict 是 Python dict 子类的名称(请参阅documentation)——它不会按照你的想法做,所以不要使用这个术语。您可以轻松创建自己的子类来满足您的需求。

标签: python dictionary


【解决方案1】:

正如我在comment 中提到的,您可以定义自己的字典子类来执行您想要的操作(只需回显缺少的键 - 它不会添加它们):

class MyDefaultDict(dict):
    def __missing__(self, key):
        return key


mydict = MyDefaultDict({'A':'a',
                        'B':'b',
                        'C':'c'})

print(f"{mydict['D']=}")  # -> mydict['D']='D'

【讨论】:

  • 已设置为建议覆盖 __getitem__(),但这要好得多。
  • 重要时的微优化:删除self 参数(因为你没有用它),并用@staticmethod 装饰__missing__ 的定义。将查找丢失密钥的成本降低了约 25%(在 WSLv2 下的 Alpine Linux 上运行的 CPython 3.9.7 上进行了测试)。
  • @Mark:是的,这个钩子正好允许dict 子类(例如Counterdefaultdict)处理丢失的键,而不会减慢键查找的核心代码路径。 dict 的默认 __getitem__ 是在引发 KeyError 之前作为后备选项查找失败时调用 __missing__ 的内容。
  • @ShadowRanger:很有趣,但在回答这样的基本问题时我不会提到 - 此外,你知道他们对过早优化的看法......
【解决方案2】:

collection.defaultdict 用于获取值的工厂,因此在设置对时,也不在获取时

只需使用dict.get

mydict = {'A':'a','B':'b','C':'c'}
print(mydict.get('A', 'A'))  # a
print(mydict.get('D', 'D'))  # D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-02
    • 2015-10-28
    • 1970-01-01
    • 2019-08-24
    • 2015-07-06
    • 2011-02-05
    • 2011-11-23
    相关资源
    最近更新 更多