pythonでは、辞書のように扱われるクラスを作成する方法がありますが、新しいインスタンスが作成されたときにキーが事前定義されていますか?事前定義されたキーで辞書を作成する
答えて
内蔵型を簡単に拡張できます。これは、あなたが辞書でそれを行うだろうかです:
>>> 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 Pythonhas a few examplesこれを行うには。
dictのサブクラスを作成し、メソッドでキーを追加するだけです。
class MyClass(dict) def __init__(self): """Creates a new dict with default values"""" self['key1'] = 'value1'
あなたはそれがサブクラスであることについてあまり心配する必要はありませんので、あなたの代わりに辞書を実装することができ、「辞書のような行為は」通常、1つのように扱われていることというのpythonで任意のクラス、しかし覚えておいてくださいメソッドがありますが、上記のアプローチはおそらくあなたにとってもっと役に立ちます:)。
あなたがそれをサブクラス化することができますので、はい、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'}
あなたはまた、__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の追加情報 –
これは私にとって完璧な解決策です、ありがとう!しかし、最初にアンカー文字で '_keys'プロパティを宣言する理由を説明できますか? –
応答が遅くなりますが、先頭のアンダースコアはメンバーがローカル(「保護」)であることを示す非公式の表記です。 –
をオーバーライドすることで、私は、これはあなたが探しているものであるわからないんだけど、私が読んだときに、dictのサブクラスは、事前に定義されたリストに鍵を制限することができますあなたの記事私は即座に、演習をカウントするためのキーを動的に生成することを検討していると思っていました。デフォルトでは、あなたのためにこれを行います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. 事前に定義された言葉
- 2. Signalr私はC#でタイプを定義した、ネストされたキー/値辞書
- 3. jQueryでonclickに事前定義された関数を追加
- 4. 辞書キーで注文された辞書要素のリストを取得する
- 5. 事前に定義されたモデルのメソッドをオーバーライド:「削除()」
- 6. CruiseControl.NETプリプロセッサで事前定義されたブロックに定数を渡す
- 7. 別の辞書で定義されたStyleでBasedOnプロパティを使用する
- 8. 指定されたキーが辞書に存在しません
- 9. Azureで事前生成されたエンティティフレームワークビュー
- 10. のJavaScript:事前に定義された変数
- 11. チェックjavaの事前に定義された方法
- 12. スパークなし事前定義されたスキーマは
- 13. C - passポインタとして事前定義された関数
- 14. ビジュアルエディタに事前定義されたテキストを挿入するためのPloneプラグイン
- 15. Pythonで重複するキーでネストされた辞書を作成する方法
- 16. 定義済みのキー順を持つ辞書型
- 17. SQLiteは、事前に設定されたFTSテーブルを作成します
- 18. ログインと事前作成されたSessionManagerクラスでのセッション使用
- 19. 辞書を変数に正確に定義されたファイルに出力する
- 20. Cython - 辞書のキーと値の静的型定義
- 21. スウィフト辞書は、私のように定義された辞書を持っている値
- 22. 事前定義されたデータを.crxでブラウザのローカルストレージに送信
- 23. Pythonはキーが辞書で定義されていることを確認します
- 24. 辞書のキー
- 25. python辞書キー
- 26. "辞書"と "キー"がPythonで定義されていないのはなぜですか?
- 27. Tmuxで事前定義された検索を実行するようにバインディングを設定します
- 28. 辞書を作成する<string>辞書<string、string>
- 29. 辞書の辞書を作成する方法vbscript
- 30. 辞書の辞書のユニークキーを作成する
私の好奇心を飽和させていただきありがとうございます。 –
私はdict .__ init__への呼び出しを からhttp://stackoverflow.com/questions/817884/creating-dictionaries-with-pre-defined-keys/818019#818019(またはさらに優れた、ユーザーの方が良い)から追加するべきだと思います。 –
これは元々(履歴をチェックして)それを持っていた方法ですが、いくつかの調査の後では、この場合は明らかに必要ありません。上記のDive Into Pythonのリンクによれば、 "dictはこのようには動作せず、ラッパーでもなく、明示的な初期化も必要ありません。" - そこにスーパーコールを持っていたのは私の最初の本能だったので、それについてもう少し詳しく知りたいです。 –