2016-12-17 6 views
0

辞書の値であるリストの値を変更したいと思います。 Pythonの方法でこれをコード化するとうまくいきませんが、リストの古典的なインデックスを使用するとうまくいきます。 私は何を意味するかを明確にするために、私は小さなデモを書きました。リスト内の4より小さいすべての値を1ずつ増やしたいと思います。dict値であるリストを変更する

A = [1, 2, 3, 4, 5] 
x = {"a": [1, 2, 3, 4, 5]} 

print("example 1, this works") 
A = [a+1 if a < 4 else a for a in A] 
print(A) 

print("example 2, this not") 
for v in x.values(): 
    v = [a + 1 if a < 4 else a for a in v] 
print(x) 

print("example 3, this not either") 
for v in x.values(): 
    for a in v: 
     a = a+1 if a < 4 else a 
print(x) 

print("example 4, but this does") 
for v in x.values(): 
    for i in range(len(v)): 
     if v[i] < 4: v[i] += 1 
print(x) 

出力:

example 1, this works 
[2, 3, 4, 4, 5] 
example 2, this not 
{'a': [1, 2, 3, 4, 5]} 
example 3, this not either 
{'a': [1, 2, 3, 4, 5]} 
example 4, but this does 
{'a': [2, 3, 4, 4, 5]} 

2つのことが不可解されています 1.リストは、それが辞書の値であるか否かに応じて異なる方法で処理されます。 2.リスト値の変更は、適用するループ手法によって異なります。

私以外の理由はありますか? (可能性があります)はいの場合、それは何ですか?このコードで

+2

あなたはhttp://nedbatchelder.com/text/names.htmlを読むべきです – chepner

答えて

1

for v in x.values(): 
    v = [a + 1 if a < 4 else a for a in v] 

あなたは次の反復で失われvため新しい参照を、作成しているので、それが辞書には反映されません。私はこれを行うでしょう:

for v in x.values(): 
    v[:] = [a + 1 if a < 4 else a for a in v] 

したがって、参照は変更されず、ディクテーションが更新されます。それを行う別の方法は、キーを介して値にアクセスすることです。あなたは別の参照を作成しているが、それは辞書に保存されています:

for k in x: 
    x[k] = [a + 1 if a < 4 else a for a in v] 

例(4)あなたの質問の同じ(逆)の理由で動作します:あなたはに含まれているvの参照に取り組んでいます辞書を変更せずに、辞書に反映されます。

+0

'v [:]'はどうしますか? – Stats4224

+1

新しいリストを生成せずにリストに書き込むことができるように、完全なリストをリストのスライスとして提供します。 –

0

興味深い質問です。これの要点は、dictメソッドの.values()は、そのキーの値である配列への直接の参照ではなく、view objectを返しているということです。

したがって、.values()によって返されるリストを変更することで、辞書のリストの値を変更することはできません。したがって、辞書要素に直接アクセスする必要があります。これは.itemsを使用されるだろう行う一つの方法()の代わりに:

x = {"a": [1, 2, 3, 4, 5]} 
for key, value in x.items(): 
    x[key] = [a + 1 if a < 4 else a for a in value] 

は、より多くの議論のためにthis questionでのコメントも参照してください。

+0

はい、あなたは正しいと思われます。しかし、それが – Martijn

+0

にアクセスしない場合、ビューの使用は何ですか?それは辞書要素の「ライブ」ビューを提供します。したがって、要素を変更すると、ビューにもこの変更が反映されます。しかし、私は同意する、私はデータのこの一方的な反映の使用を参照してください私は確信していない。 – Stats4224

関連する問題