2011-07-28 4 views
3

これは私の最初のプログラミングポストであり、最初のプログラムでもありますので、私に同行してください。私は、辞書内の各値に整数を追加できるようにしたいPython:辞書の値を変更するための追加の使用

tab = ({'Mike': 0, 'Chad': 15, 'Taylor': 2}) 

私はそうのように初期化されdicionaryを持っています。
たとえば、5を追加した後、辞書には、次のようになります。これは、数行のコードで行うことができますが、私はそれを把握することはできませんかのように思え

tab = ({'Mike':5, 'Chad': 20, 'Taylor': 7}) 

。 私は、forループを試してみた:

for k in tab.itervalues(): 
    k = k + 5 

私はこのコードを実行して、辞書をプリントアウト:

tab = ({'Mike': 0, 'Chad': 15, 'Taylor': 2}) 

辞書には何の変化を遂げていません。 Pythonが値を文字列または整数として認識するかどうかはわかりません。あなたのうちの何人かが私の質問とそのシンプルさを笑っていると確信しています。ご注意いただきありがとうございます。

+1

{}の前後にかっこは必要ありません。 – utdemir

+0

'k = k + 5'という行は実際には新しい変数を作成しています。あなたはそれを見ることができません。なぜなら、Pythonはそれを隠しているからです(これはPythonのパス・バイ・オブジェクト・パラダイムの一部です)。しかし、それはここにもそこにはありません。たとえあなたがkを修正できたとしても、それは辞書を修正しません。正しいアプローチについては、waffle paradoxの回答を参照してください。 –

答えて

12

最も簡単な方法は?

for k in tab.keys(): 
    tab[k] += 5 
+2

ちょうど 'for k in tab'? – utdemir

+0

正直なところ、私はtab.keys()を読みやすくしていますが、うまくいくと思います。 –

+0

ありがとうございます。私は学ぶべきことがたくさんある、私はループのために始めるだろう。 – MZ420

6

tab.itervalues()は、値を超える反復子を作成します。

これらを繰り返し、それぞれの値が順番に渡されます。値はintです。 Pythonでは、これらは不変のです。

Pythonでは、a += 3の文がの場合はa = a + 3に変換されます。 a + 3aがすでにintを参照していて、aの名前が新しいオブジェクトにリバウンドされた場合、の新しい intオブジェクトを作成します。

したがって、反復変数を(再バインドして)変更しますが、マップ内の値は変更できません(変更不可能なため)。

ワッフルパラドックスの解決策は、キーのイテレータを使用してアクセスし、次にその値をリビルドすることによってこれを回避します。これはシンプルでPythonicで上質です。

を使用して、機能プログラミングパラダイムを適用することもできます。私たちは持っているものと同じような辞書を作成したいが、鍵はインクリメントされている。 tabがこの新しい辞書を参照するようにすることは、付随的なことです。

したがって:あなたは同じ根本的な問題に基づいて難しい問題を抱えているとき

tab = dict((k, v + 5) for (k, v) in tab.iteritems()) 

このアプローチは、多くの場合、あなたの人生が容易になります。

+1

私の自然な傾向は元の辞書を突然変異させることでした。私は代わりのアプローチが好きで、私は将来のためにそれを念頭に置いています。 – steveha

+1

最近では、tab.items()} 'でk、vのためにもっときれいな' tab = {k:v + 5}を書くことができます。 –

関連する問題