在python中,有没有办法创建一个类似字典的类,但在创建新实例时预先定义了键?使用预定义键创建字典
3
A
回答
8
您可以轻松地扩展任何内置类型。这是你如何与一个字典做:
>>> 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文档,但非常畅销书Dive Into Python(免费提供在线)has a few examples就这样做。
0
只需创建一个dict的子类并在init方法中添加密钥即可。
class MyClass(dict) def __init__(self): """Creates a new dict with default values"""" self['key1'] = 'value1'
但请记住,在蟒蛇是'像字典的行为就像一个通常被处理任何类,所以你不必太担心它是一个子类,你可以改为执行字典方法,虽然上面的方法可能对你更有用:)。
3
是,在Python dict
是一个类,所以你可以继承它:
class SubDict(dict):
def __init__(self):
dict.__init__(self)
self.update({
'foo': 'bar',
'baz': 'spam',})
在这里,你重写字典的__init__()
方法(在创建类的实例时被调用的方法)。在__init__
里面,你首先调用supercalss的__init__()
方法,当你想要扩展基类的功能时,这是常见的做法。然后,用您的初始数据更新SubDictionary
的新实例。
subDict = SubDict()
print subDict # prints {'foo': 'bar', 'baz': 'spam'}
8
您也可以在字典子类限制键的预定义列表,通过重写__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
1
我不知道这是你在寻找什么,但是当我读到您的帖子我立即认为您正在寻找动态生成计数练习的键。
不像perl,它会默认为你做这个,
grep{$_{$_}++} qw/ a a b c c c /;
print map{$_."\t".$_{$_}."\n"} sort {$_{$b}$_{$a}} keys %_;
c 3
a 2
b 1
Python会不会给你这个免费:
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'
然而,defaultdict会为你做这个,
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)
相关问题
- 1. 使用预定义键创建字典C#
- 2. 使用键创建词典
- 3. 我可以在iPhone上创建自定义键盘字典吗?
- 4. 创建匿名类作为字典中的自定义键
- 5. 创建自定义的有序字典
- 6. 如何创建Android自定义键盘或编写自定义字典?
- 7. 创建使用字典
- 8. 使用VBA创建字典
- 9. 创建使用循环Python字典而不定义单独
- 10. C#集预知整数作为字典的自定义键的
- 11. 如何使用旧字典键的先前值在另一个字典中创建字典键
- 12. 在Joomla中使用预定义字段创建自定义文章类型
- 13. 如何在AS3中使用字符串键定义字典?
- 14. 如何使用俄语字母创建自定义键盘?
- 15. 如何使用数字创建自定义Android键盘?
- 16. 不使用class关键字创建自定义元素
- 17. 使用与另一个字典中的键相同的值创建字典
- 18. 如何创建键,值字典在python
- 19. 创建一个安卓键盘字典
- 20. Python从字典键中创建新列
- 21. 为我的字典创建唯一键
- 22. 从Python字典键创建变量
- 23. 如何使用预定义的关键
- 24. 创建字典
- 25. 使用FOSUserBundle创建自定义字段
- 26. 从每多个值的字典创建新字典的键
- 27. 与if语句定义字典键
- 28. 使用var()创建字典键的属性名称
- 29. Wtforms-使用每个键有两个值的formfield创建字典
- 30. 用自定义类对象创建字典
啊,谢谢你满足我的好奇心。 – 2009-05-03 20:16:30
我认为你应该添加调用字典.__ init__从 http://stackoverflow.com/questions/817884/creating-dictionaries-with-pre-defined-keys/818019#818019(甚至更好,超级用户)。 – 2009-05-03 21:23:48
这就是我最初的样子(查看历史记录),但经过一番研究后,你显然不需要这种情况。根据上面的Dive Into Python链接:“dict不能像这样工作;它不是一个包装,它不需要显式初始化。” - 尽管如此,我还是想了解更多的细节,因为这是我第一次直接在那里打超级电话。 – 2009-05-03 21:31:47