1

私はこれを持っていました:

[{'name': 'Peter'}, {'name': 'Anna'}]

そして、私はそれからこれを作りたかった:

[{'name': 'Peter Williams'}, {'name': 'Anna Williams'}]

だから私はした:

>>> li = [{'name': 'Peter'}, {'name': 'Anna'}]
>>> new_li = []
>>> dic = {}
>>> for i in li:
...     dic["name"] = i["name"] + " Williams"
...     new_li.append(dic)

しかし:

>>> new_li
[{'name': 'Anna Williams'}, {'name': 'Anna Williams'}]

なんで?

最良の入手方法も教えていただけます[{'name': 'Peter Williams'}, {'name': 'Anna Williams'}]か?

編集

この動作を理解できなかった理由は、次のように仮定したためです。

>>> dict = {'name':'Peter'}
>>> lis = [dict]
>>> dict['name'] = 'Olaf'

どこ

>>> print lis

与える

[{'name': 'Peter'}]

実際そうでありながら

[{'name': 'Olaf'}]
4

4 に答える 4

2

各反復で同じ辞書オブジェクトを使用しているためです。

2 回目の繰り返しではname、前の繰り返しでキーに割り当てた値を変更しているため、リストには同じオブジェクトへの 2 つの参照が含まれることになります。

「Python Tutor」ツール (pythontutor.com) を確認することを強くお勧めします。このツールを使用すると、一部の Python コードの実行を視覚化し、スタックで作成されているオブジェクトを確認できます。例: Python Tutor とコード

あなたが望むことをする正しい方法は次のようになります:

li = [{'name': 'Peter'}, {'name': 'Anna'}]
new_li = []
for p in li:
    new_p = {'name': p['name'] + ' Williams'}
    new_li.append(new_p)

このようにして、反復ごとに新しいディクショナリ オブジェクトが作成されます。

より簡潔な解決策:

li = [{'name': 'Peter'}, {'name': 'Anna'}]
new_li = [{'name': p['name'] + ' Williams'} for p in li]
于 2012-11-02T23:09:51.950 に答える
0

ループの反復ごとに新しい辞書を作成する必要があります。それ以外の場合は、反復ごとに同じオブジェクトを変更して追加しますnew_li

>>> li = [{'name': 'Peter'}, {'name': 'Anna'}]
>>> new_li = []
>>> for i in li:
...     new_li.append({'name': i['name'] + ' Williams'})
...
>>> new_li
[{'name': 'Peter Williams'}, {'name': 'Anna Williams'}]
于 2012-11-02T23:11:03.357 に答える
0

その場で変更したいと思います。新しい dict を作成する必要はありません。

for d in inlist:
    d["name"] += " Williams"

あなたがしなければならないすべてです。

于 2012-11-02T23:13:15.877 に答える
0

あなたは本当に厄介な問題に遭遇しました。問題はあなたにありますdic。名前のリストを反復処理しており、最初に 'Peter' をヒットします。この時点で、に設定dic{'name': 'Peter Williams'}て追加します。しかし、その後、'Anna' の 1 つをヒットし、まったく同じものdicをに変更し{'name': 'Anna Williams'}ます。したがって、リストに同じ辞書が2 回表示されることになります。これを修正するには、代わりにこれを行う必要があります。

new_li = []
for i in li:
      n_li.append({'name': i['name'] + ' Williams'})
于 2012-11-02T23:13:41.520 に答える