質問
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ドキュメントは見つかりませんでしたが、非常に人気のある本 Dive Into Python (オンラインで無料で利用可能)これを行う例がいくつかあります。 p>
他のヒント
__ 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のように動作する」クラスは通常1つのように扱われるので、サブクラスであることをあまり心配する必要はありませんが、代わりにdictメソッドを実装できますが、上記のアプローチはおそらくあなたにとってより便利です:)。