相关疑难解决方法(0)

如何"完美"覆盖一个字典?

我怎样才能使"完美"成为dict的子类?最终目标是有一个简单的字典,其中键是小写的.

似乎应该有一些微小的原语我可以覆盖以使这项工作,但根据我的所有研究和尝试似乎情况并非如此:

这是我的第一次尝试,get()不起作用,毫无疑问还有许多其他小问题:

class arbitrary_dict(dict):
    """A dictionary that applies an arbitrary key-altering function
       before accessing the keys."""

    def __keytransform__(self, key):
        return key

    # Overridden methods. List from 
    # https://stackoverflow.com/questions/2390827/how-to-properly-subclass-dict

    def __init__(self, *args, **kwargs):
        self.update(*args, **kwargs)

    # Note: I'm using dict directly, since super(dict, self) doesn't work. …
Run Code Online (Sandbox Code Playgroud)

python inheritance dictionary get set

204
推荐指数
5
解决办法
10万
查看次数

如何正确地子类化dict并覆盖__getitem__&__setitem__

我正在调试一些代码,我想知道何时访问特定的字典.好吧,它实际上是一个子类dict并实现了一些额外功能的类.无论如何,我想做的是dict自己子类化并添加覆盖__getitem____setitem__产生一些调试输出.现在,我有

class DictWatch(dict):
    def __init__(self, *args):
        dict.__init__(self, args)

    def __getitem__(self, key):
        val = dict.__getitem__(self, key)
        log.info("GET %s['%s'] = %s" % str(dict.get(self, 'name_label')), str(key), str(val)))
        return val

    def __setitem__(self, key, val):
        log.info("SET %s['%s'] = %s" % str(dict.get(self, 'name_label')), str(key), str(val)))
        dict.__setitem__(self, key, val)
Run Code Online (Sandbox Code Playgroud)

' name_label'是一个最终将设置的键,我想用它来识别输出.然后我改变了我正在修改的类DictWatch而不是dict更改了对超级构造函数的调用.但是,似乎没有任何事情发生.我以为我很聪明,但我想知道我是否应该走另一个方向.

谢谢您的帮助!

python dictionary

75
推荐指数
5
解决办法
8万
查看次数

Pandas .map 字典默认缺失值

pandas.Series.map 的Pandas 文档 说:

“当arg是字典时,Series中不在字典中的值(作为键)将转换为NaN。但是,如果字典是定义missing的dict子类(即提供默认值的方法),则此默认值使用而不是 NaN。”

你实际上是如何做到的?我无法让它工作..

class MyDict(collections.UserDict):
    
  def __missing__(self):
    return "_Unknown"

d = MyDict({k: v for k, v in my_list})

df.col1.map(d)

Run Code Online (Sandbox Code Playgroud)

python dictionary missing-data pandas

7
推荐指数
1
解决办法
3497
查看次数

标签 统计

dictionary ×3

python ×3

get ×1

inheritance ×1

missing-data ×1

pandas ×1

set ×1