3

私は辞書のリストに少し頭が痛いです。

def funk(x):
    for i in x:
        i['a'] += 1
        print i

list1 = [{'a':1, 'b':2}, {'a':3, 'b':4}]
funk(list1)
print list1

これは出力されます:

{'a': 2, 'b': 2}
{'a': 4, 'b': 4}
[{'a': 2, 'b': 2}, {'a': 4, 'b': 4}]

しかし、私はこれが欲しい:

{'a': 2, 'b': 2}
{'a': 4, 'b': 4}
[{'a':1, 'b':2}, {'a':3, 'b':4}]

list1手つかずのままにするにはどうすればよいですか?例えば:[{'a':1, 'b':2}, {'a':3, 'b':4}]

4

3 に答える 3

7

funk()xオリジナルを変更する代わりに、コピーを作成してそのコピーを変更できますx

import copy

def funk(x):
    x = copy.deepcopy(x)
    for i in x:
        i['a'] += 1
        print i

list1 = [{'a':1, 'b':2}, {'a':3, 'b':4}]
funk(list1)
print list1
于 2012-12-10T16:56:08.857 に答える
1

copyここで辞書の方法が役立つかもしれないと私には思えます:

def funk(x):
    for i in x:
        new_dict = i.copy()
        new_dict['a'] += 1
        print new_dict
于 2012-12-10T16:58:35.563 に答える
1

明らかに、実行可能かどうかは操作の複雑さ/目標によって異なりますが、リストをその場で変更する代わりに、リスト内包表記を使用して新しいリストを作成します。

def funk(x):
    return [{key: value+1 if key == "a" else value for key, value in i.items()} for i in x]

あなたの例では、値を出力しているので、これは役に立ちませんが、辞書の新しい変更されたリストを持つことで意図を満たすことができる場合、それが最善の方法かもしれません。

于 2012-12-10T16:59:04.887 に答える