2011-09-20 11 views
5

辞書が既に存在していてもそれが機能していない場合は、リストからその辞書を削除しようとしています。誰もが私が間違っているのかを見るか、私はpython - リストが存在する場合は辞書から削除する

new_dict = {'value': 'some value', 'key': 'someKey'} 
if new_dict in my_list: 
    my_list.remove(new_dict) 

new_listがnew_dictは間違い

+4

を除去しなかった実現しない、すなわちどのように、あなたはループの後my_listで何をすべきかmy_list

  • を構築する方法:見て興味深いものになるだろう。どのようにmy_listをビルドしますか? – Louis

  • 答えて

    7

    new_dictは「間違いなく」my_listである場合には、my_list.remove(new_dict)は(それを遅くすることをif new_dict in my_listため、すなわち、不要)トリックを行う必要があります。

    +3

    これです。安全な側にするために、 'try/except'でそれを囲み、' ValueError'を扱うことができます。 –

    1

    にほとんどの場合、新しいリストを作成する賢いです辞書のリストであるがやるべきものを私に助言することができます。

    new_list = [ dd for dd in my_list if not dd is new_dict ] 
    

    これは、副作用を回避するため、関数型プログラミングの典型です。関数またはメソッドでソリューションを使用するとします。ほとんどの場合、内部目的でのみ変更されたリストが必要です。入力パラメータを変更するのは危険です。

    +0

    '=='の代わりに 'is'を使用してもよろしいですか? –

    +0

    これは質問に対する答えではありません。彼が持っているものが彼のために働いていないならば、それは何も変わらない別の方法です。個人的には、「ほとんどの場合、新しいリストを作成するのは賢明です」と強く反対します。私は時にはそれが望ましいと言いますが、ほとんどの場合、それはちょうど効率的ではありません。 –

    +0

    @ティム:それは変わる。しかし、質問が "in"で使用されるように、あなたは正しいです、 "=="でなければなりません。 – rocksportrocker

    4
    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 
    

    これは両方の辞書のために機能しました。

    0

    と同じのリストを反復処理しながらリストから削除することは安全ではありません。あなたがしたいことは、次のようなものです:

    copied_list = my_list[:] 
    if new_dict in copied_list: 
        my_list.remove(new_dict) 
    

    このようにして、リストのコピーを繰り返して元のものから削除します。

    これは問題の原因ではないかもしれません。

    • をあなたがあなたの辞書はこれが私の作品
    関連する問題