私は以下のコードに少し戸惑います。
d = {'x': 1, 'y': 2, 'z': 3}
for key in d:
print key, 'corresponds to', d[key]
私が理解できないのはkey
の部分です。 Pythonは辞書からキーを読むだけでよいことをどのように認識しますか? key
はPythonの特別な単語ですか?それとも単なる変数ですか?
key
は単なる変数名です。
for key in d:
キーと値ではなく、単に辞書内のキーをループします。キーと値の両方をループするには、次のようにします。
Python 2.xの場合:
for key, value in d.iteritems():
Python 3.xの場合:
for key, value in d.items():
自分でテストするには、Wordのkey
をpoop
に変更します。
Python 3.xでは、iteritems()
は単なるitems()
に置き換えられました。これは、iteritems()
のような辞書に裏打ちされたセットのようなビューを返しますが、さらに良いものです。これは2.7ではviewitems()
としても利用可能です。
操作items()
は2と3の両方で動作しますが、2では辞書の(key, value)
ペアのリストを返します。これはitems()
呼び出しの後に起こる辞書の変更を反映しません。 3.xで2.xの動作をしたい場合は、list(d.items())
を呼び出します。
そのキーが特別なWordであるということではありませんが、辞書がイテレータプロトコルを実装するということです。あなたはあなたのクラスでこれを行うことができます。 この質問 クラスイテレータの作り方は/を見てください。
辞書の場合は、Cレベルで実装されています。詳細は PEP 234 にあります。特に、 "Dictionary Iterators"というタイトルのセクション:
辞書はtp_iterスロットを実装しています。このスロットは辞書のキーを繰り返し処理する効率的な反復子を返します。 [...]これは私達が書くことができることを意味します
for k in dict: ...
これは同等ですが、よりずっと速いです
for k in dict.keys(): ...
(ループまたは別のスレッドによる)辞書への変更の制限に違反しない限り。
明示的に異なる種類のイテレータを返す辞書にメソッドを追加します。
for key in dict.iterkeys(): ... for value in dict.itervalues(): ... for key, value in dict.iteritems(): ...
これは
for x in dict
がfor x in dict.iterkeys()
の省略形であることを意味します。
Python 3では、dict.iterkeys()
、dict.itervalues()
、dict.iteritems()
はサポートされなくなりました。代わりにdict.keys()
、dict.values()
、およびdict.items()
を使用してください。
dict
を繰り返し処理することで、ここでわかるように、キーを特定の順序で繰り返すことができます。
編集:(これはPython3.6ではもはや当てはまらないですが、 未保証 動作に注意
>>> d = {'x': 1, 'y': 2, 'z': 3}
>>> list(d)
['y', 'x', 'z']
>>> d.keys()
['y', 'x', 'z']
あなたの例では、dict.items()
を使うのがより良い考えです:
>>> d.items()
[('y', 2), ('x', 1), ('z', 3)]
これはあなたにタプルのリストを与えます。このようにそれらをループすると、各Tupleは自動的にk
とv
に展開されます。
for k,v in d.items():
print(k, 'corresponds to', v)
k
をループするときに変数名としてv
とdict
を使用するのは、ループの本体が数行しかない場合には一般的です。より複雑なループの場合は、もっとわかりやすい名前を使用することをお勧めします。
for letter, number in d.items():
print(letter, 'corresponds to', number)
フォーマット文字列を使用する習慣を身に付けることをお勧めします。
for letter, number in d.items():
print('{0} corresponds to {1}'.format(letter, number))
key
は単なる変数です。
Python2.X :の場合
d = {'x': 1, 'y': 2, 'z': 3}
for my_var in d:
print my_var, 'corresponds to', d[my_var]
...以上
d = {'x': 1, 'y': 2, 'z': 3}
for the_key, the_value in d.iteritems():
print the_key, 'corresponds to', the_value
Python3.X :の場合
d = {'x': 1, 'y': 2, 'z': 3}
for the_key, the_value in d.items():
print(the_key, 'corresponds to', the_value)
for .. in ..
-構文を使用して辞書を反復処理するときは、常にキーを反復処理します(値はdictionary[key]
を使用してアクセスできます)。
キーと値のペアを反復処理するには、for k,v in s.iteritems()
を使用します。
これは非常に一般的な繰り返しの慣用句です。 in
は演算子です。いつfor key in dict
を使うべきか、そしていつfor key in dict.keys()
でなければならないかについては、 David GoodgerのIdiomatic Pythonの記事 を参照してください。
これを使うことができます:
for key,val in d.items():
print key, 'is the key for ', val
キー、値のペア、および現在地を示すインデックスを取得するために辞書を反復処理する必要があるユースケースがあります。これが私のやり方です。
d = {'x': 1, 'y': 2, 'z': 3}
for i, (key, value) in enumerate(d.items()):
print(i, key, value)
キーを囲む括弧、値は重要であることに注意してください。括弧がないと、ValueError "展開するのに十分な値ではありません"が得られます。
今日の私の箱に入っているPython 2.6と2.7、そして3.xはitems()
でうまくいきます。
z = {0: 'a', 1: 'b'}
for k, v in z.items(): print(v, k)
「for」ループを使用して辞書を繰り返す
d = {'x': 1, 'y': 2, 'z': 3} for key in d: ...
Pythonは辞書からキーを読むだけでよいことをどのように認識しますか? keyはPythonの特別なWordですか?それとも単なる変数ですか?
それは単にfor
ループではありません。ここで重要な言葉は「繰り返し」です。
辞書は、キーと値のマッピングです。
d = {'x': 1, 'y': 2, 'z': 3}
それを繰り返すたびに、キーを繰り返す。変数名key
は説明的なものにすぎません - その目的には非常に適しています。
これはリスト内包表記で起こります:
>>> [k for k in d]
['x', 'y', 'z']
これは、辞書をlist(または他のコレクション型オブジェクト)に渡すと発生します。
>>> list(d)
['x', 'y', 'z']
Pythonが反復する方法は、必要に応じて、オブジェクト(この場合は辞書)の__iter__
メソッドを呼び出し、反復子(この場合はキータイターオブジェクト)を返します。
>>> d.__iter__()
<dict_keyiterator object at 0x7fb1747bee08>
これらの特別なメソッドを自分自身で使うべきではなく、代わりにそれぞれの組み込み関数iter
を使って呼び出します。
>>> key_iterator = iter(d)
>>> key_iterator
<dict_keyiterator object at 0x7fb172fa9188>
イテレータには__next__
メソッドがありますが、組み込み関数next
を使って呼び出します。
>>> next(key_iterator)
'x'
>>> next(key_iterator)
'y'
>>> next(key_iterator)
'z'
>>> next(key_iterator)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
イテレータが使い果たされると、StopIteration
が発生します。これがPythonがfor
ループ、リスト内包表記、ジェネレータ式、その他の反復コンテキストを終了することを知っている方法です。イテレータがStopIteration
を上げると、それは常にそれを上げます - もしあなたが再び繰り返したいのなら、あなたは新しいものを必要とします。
>>> list(key_iterator)
[]
>>> new_key_iterator = iter(d)
>>> list(new_key_iterator)
['x', 'y', 'z']
私たちは多くの文脈で繰り返しの繰り返しを見てきました。これまで見てきたことは、辞書を反復処理するたびにキーが得られるということです。元の例に戻る:
d = {'x': 1, 'y': 2, 'z': 3} for key in d:
変数名を変更しても、キーは得られます。試してみよう:
>>> for each_key in d:
... print(each_key, '=>', d[each_key])
...
x => 1
y => 2
z => 3
値を反復処理したい場合は、辞書の.values
メソッドを使用するか、または両方で.items
を使用する必要があります。
>>> list(d.values())
[1, 2, 3]
>>> list(d.items())
[('x', 1), ('y', 2), ('z', 3)]
与えられた例では、このような項目を反復処理するほうが効率的です。
for a_key, corresponding_value in d.items():
print(a_key, corresponding_value)
しかし学術的な目的のために、質問の例はちょうどいいです。
GitHubでCPythonのdicttype
の実装をチェックすることができます。これは、辞書反復子を実装するmethodのシグネチャです。
_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
PyObject **pvalue, Py_hash_t *phash)
キーを繰り返し処理するには、遅くなりますがmy_dict.keys()
を使用するのが良いでしょう。あなたがこのようなことをやろうとしたならば:
for key in my_dict:
my_dict[key+"-1"] = my_dict[key]-1
プログラムの実行中にキーを変更しているため、ランタイムエラーが発生します。もしあなたが絶対に時間を短縮することに専念しているなら、for key in my_dict
の方法を使ってください、しかしあなたは警告されました;)。
My_dictのkeyの場合、実際にはmy_dict.keys()のkeyの場合と同じです。ですから、dictの値を取得したい場合は、2つの方法があります。
1:
for value in my_dict.values():
print(value)
二:
for key in my_dict:
print(my_dict[key])
長い値の印刷提案
値に長い文字列がある場合、これを(もっと?)読みやすい形式で出力する簡単な方法があります。for key, value in my_dictionary.iteritems(): print(key) print("---------") print(value) print("\n")