在python中,有没有办法创建一个被视为字典但在创建新实例时预先定义了键的类?

有帮助吗?

解决方案

您可以轻松扩展任何内置类型。这就是你用dict做的方式:

>>> class MyClass(dict):
...     def __init__(self, *args, **kwargs):
...             self['mykey'] = 'myvalue'
...             self['mykey2'] = 'myvalue2'
...
>>> x = MyClass()
>>> x['mykey']
'myvalue'
>>> x
{'mykey2': 'myvalue2', 'mykey': 'myvalue'}

我无法找到谈论这个的Python文档,但非常受欢迎的书潜入Python (可在线免费获得)提供了一些示例

其他提示

您也可以让dict子类通过重写 __ setitem __()

将键限制为预定义列表
>>> class LimitedDict(dict):
    _keys = "a b c".split()
    def __init__(self, valtype=int):
        for key in LimitedDict._keys:
            self[key] = valtype()
    def __setitem__(self, key, val):
        if key not in LimitedDict._keys:
            raise KeyError
        dict.__setitem__(self, key, val)


>>> limited = LimitedDict()
>>> limited['a']
0
>>> limited['a'] = 3
>>> limited['a']
3
>>> limited['z'] = 0

Traceback (most recent call last):
  File "<pyshell#61>", line 1, in <module>
    limited['z'] = 0
  File "<pyshell#56>", line 8, in __setitem__
    raise KeyError
KeyError
>>> len(limited)
3

是的,在Python dict 是一个类,所以你可以将它子类化:

    class SubDict(dict):
        def __init__(self):
            dict.__init__(self)
            self.update({
                'foo': 'bar',
                'baz': 'spam',})

这里覆盖dict的 __ init __()方法(在创建类的实例时调用的方法)。在 __ init __ 里面,你首先调用supercalss的 __ init __()方法,这是一种常见的做法,当你想扩展基类的功能时。然后使用初始数据更新 SubDictionary 的新实例。

    subDict = SubDict()
    print subDict    # prints {'foo': 'bar', 'baz': 'spam'}

我不确定这是你在寻找什么,但是当我读到你的帖子时,我立即认为你正在寻找动态生成计数练习的键。

与perl不同,默认情况下会为你执行此操作,


grep{

我不确定这是你在寻找什么,但是当我读到你的帖子时,我立即认为你正在寻找动态生成计数练习的键。

与perl不同,默认情况下会为你执行此操作,


l = ["a","a","b","c","c","c"]
d = {}
for item in l:
    d[item] += 1

Traceback (most recent call last):
  File "./y.py", line 6, in 
    d[item] += 1
KeyError: 'a'

Python不会免费提供这个:


from collections import defaultdict
from operator import itemgetter

l = ["a","a","b","c","c","c"]
d = defaultdict(int)
for item in l:
    d[item] += 1

dl = sorted(d.items(),key=itemgetter(1), reverse=True)
for item in dl:
    print item

('c', 3)
('a', 2)
('b', 1)

但是,defaultdict会为你做这个,

<*>{

我不确定这是你在寻找什么,但是当我读到你的帖子时,我立即认为你正在寻找动态生成计数练习的键。

与perl不同,默认情况下会为你执行此操作,

<*>

Python不会免费提供这个:

<*>

但是,defaultdict会为你做这个,

<*>}++} qw/ a a b c c c /; print map{

我不确定这是你在寻找什么,但是当我读到你的帖子时,我立即认为你正在寻找动态生成计数练习的键。

与perl不同,默认情况下会为你执行此操作,

<*>

Python不会免费提供这个:

<*>

但是,defaultdict会为你做这个,

<*>."\t".

我不确定这是你在寻找什么,但是当我读到你的帖子时,我立即认为你正在寻找动态生成计数练习的键。

与perl不同,默认情况下会为你执行此操作,

<*>

Python不会免费提供这个:

<*>

但是,defaultdict会为你做这个,

<*>{

我不确定这是你在寻找什么,但是当我读到你的帖子时,我立即认为你正在寻找动态生成计数练习的键。

与perl不同,默认情况下会为你执行此操作,

<*>

Python不会免费提供这个:

<*>

但是,defaultdict会为你做这个,

<*>}."\n"} sort {

我不确定这是你在寻找什么,但是当我读到你的帖子时,我立即认为你正在寻找动态生成计数练习的键。

与perl不同,默认情况下会为你执行此操作,

<*>

Python不会免费提供这个:

<*>

但是,defaultdict会为你做这个,

<*>{$b}

我不确定这是你在寻找什么,但是当我读到你的帖子时,我立即认为你正在寻找动态生成计数练习的键。

与perl不同,默认情况下会为你执行此操作,

<*>

Python不会免费提供这个:

<*>

但是,defaultdict会为你做这个,

<*>{$a}} keys %_; c 3 a 2 b 1

Python不会免费提供这个:

<*>

但是,defaultdict会为你做这个,

<*>

只需创建一个dict的子类,并在 init 方法中添加键。

class MyClass(dict)

def __init__(self):
    """Creates a new dict with default values""""

    self['key1'] = 'value1'

请记住,在python中,任何“行为像dict”的类通常都被视为一个类,所以你不必过于担心它是一个子类,你可以改为实现dict方法,尽管上面的方法对你来说可能更有用:)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top