辞書が既に存在していてもそれが機能していない場合は、リストからその辞書を削除しようとしています。誰もが私が間違っているのかを見るか、私はpython - リストが存在する場合は辞書から削除する
new_dict = {'value': 'some value', 'key': 'someKey'}
if new_dict in my_list:
my_list.remove(new_dict)
new_listがnew_dictは間違い
辞書が既に存在していてもそれが機能していない場合は、リストからその辞書を削除しようとしています。誰もが私が間違っているのかを見るか、私はpython - リストが存在する場合は辞書から削除する
new_dict = {'value': 'some value', 'key': 'someKey'}
if new_dict in my_list:
my_list.remove(new_dict)
new_listがnew_dictは間違い
new_dict
は「間違いなく」my_list
である場合には、my_list.remove(new_dict)
は(それを遅くすることをif new_dict in my_list
ため、すなわち、不要)トリックを行う必要があります。
これです。安全な側にするために、 'try/except'でそれを囲み、' ValueError'を扱うことができます。 –
にほとんどの場合、新しいリストを作成する賢いです辞書のリストであるがやるべきものを私に助言することができます。
new_list = [ dd for dd in my_list if not dd is new_dict ]
これは、副作用を回避するため、関数型プログラミングの典型です。関数またはメソッドでソリューションを使用するとします。ほとんどの場合、内部目的でのみ変更されたリストが必要です。入力パラメータを変更するのは危険です。
'=='の代わりに 'is'を使用してもよろしいですか? –
これは質問に対する答えではありません。彼が持っているものが彼のために働いていないならば、それは何も変わらない別の方法です。個人的には、「ほとんどの場合、新しいリストを作成するのは賢明です」と強く反対します。私は時にはそれが望ましいと言いますが、ほとんどの場合、それはちょうど効率的ではありません。 –
@ティム:それは変わる。しかし、質問が "in"で使用されるように、あなたは正しいです、 "=="でなければなりません。 – rocksportrocker
my_list = [1,{'value':'some value', 'key' :'somekey'}, 2, {'z':'z', 'x': 'x'}]
new_dict = {'value':'some value', 'key' :'somekey'}
#new_dict = {'z':'z', 'x': 'x'}
differ = 0
matched = 0
for element in my_list:
if type(element) is types.DictType and matched != 0:
differ = 0
# check if dictionary keys match
if element.viewkeys() == new_dict.viewkeys():
# check if dictionary values match
for key in element.keys():
if element[key] != new_dict[key]:
differ = 1
matched = 1
if differ != 1:
my_list.remove(new_dict)
print my_list
これは両方の辞書のために機能しました。
と同じのリストを反復処理しながらリストから削除することは安全ではありません。あなたがしたいことは、次のようなものです:
copied_list = my_list[:]
if new_dict in copied_list:
my_list.remove(new_dict)
このようにして、リストのコピーを繰り返して元のものから削除します。
これは問題の原因ではないかもしれません。
を除去しなかった実現しない、すなわちどのように、あなたはループの後
my_list
で何をすべきかmy_list