2016-04-07 14 views
0

私は、トラックを保持するためのリストにキー値を追加することによって、キー値から辞書のリストを削除するかなり基本的な(ただしかなり機能していない)機能を持っています。Python重複除外キーの値によるディクショナリのリスト

辞書の二つのリストにちょうど下のスクリプトで使用されます
def dedupe(rs): 
    delist = [] 
    for r in rs: 
     if r['key'] not in delist: 
      delist.append(r['key']) 
     else: 
      rs.remove(r) 
    return rs 

recordsまたはrecords2のいずれかの場合

from pprint import pprint 

records = [ 
{'key': 'Item 1', 
    'name': 'Item 1', 
    'positions': [['00:00:00', '00:05:54'], 
       ['00:05:55', '00:07:54'], 
       ['00:16:47', '00:20:04']]}, 
{'key': 'Item 1', 
    'name': 'Item 1', 
    'positions': [['00:05:55', '00:07:54'], 
       ['00:00:00', '00:05:54'], 
       ['00:16:47', '00:20:04']]}, 
{'key': 'Item 1', 
    'name': 'Item 1', 
    'positions': [['00:16:47', '00:20:04'], 
       ['00:00:00', '00:05:54'], 
       ['00:05:55', '00:07:54']]}, 
{'key': 'Item 2', 
    'name': 'Item 2', 
    'positions': [['00:07:55', '00:11:23'], ['00:11:24', '00:16:46']]}, 
{'key': 'Item 2', 
    'name': 'Item 2', 
    'positions': [['00:11:24', '00:16:46'], ['00:07:55', '00:11:23']]}, 
{'key': 'Item 3', 'name': 'Item 3', 'positions': [['00:20:05', '00:25:56']]} 
] 

records2 = [ 
{'key': 'Item 1', 
    'name': 'Item 1', 
    'positions': [['00:00:00', '00:05:54'], 
       ['00:05:55', '00:07:54'], 
       ['00:16:47', '00:20:04']]}, 
{'key': 'Item 1', 
    'name': 'Item 1', 
    'positions': [['00:05:55', '00:07:54'], 
       ['00:00:00', '00:05:54'], 
       ['00:16:47', '00:20:04']]}, 
{'key': 'Item 2', 
    'name': 'Item 2', 
    'positions': [['00:07:55', '00:11:23'], ['00:11:24', '00:16:46']]}, 
{'key': 'Item 1', 
    'name': 'Item 1', 
    'positions': [['00:16:47', '00:20:04'], 
       ['00:00:00', '00:05:54'], 
       ['00:05:55', '00:07:54']]}, 
{'key': 'Item 2', 
    'name': 'Item 2', 
    'positions': [['00:11:24', '00:16:46'], ['00:07:55', '00:11:23']]}, 
{'key': 'Item 3', 'name': 'Item 3', 'positions': [['00:20:05', '00:25:56']]} 
] 


def dedupe(rs): 
    delist = [] 
    for r in rs: 
     if r['key'] not in delist: 
      delist.append(r['key']) 
     else: 
      rs.remove(r) 
    return rs 

if __name__ == '__main__': 
    res = dedupe(records) 
    res2 = dedupe(records2) 
    pprint(res) 
    pprint(res2) 

、私が得ることを期待する:

[ 
{'key': 'Item 1', 
    'name': 'Item 1', 
    'positions': [['00:00:00', '00:05:54'], 
       ['00:05:55', '00:07:54'], 
       ['00:16:47', '00:20:04']]}, 
{'key': 'Item 2', 
    'name': 'Item 2', 
    'positions': [['00:07:55', '00:11:23'], ['00:11:24', '00:16:46']]}, 
{'key': 'Item 3', 
    'name': 'Item 3', 
    'positions': [['00:20:05', '00:25:56']]} 
] 

しかし、その代わりにI get(2つの入力のそれぞれについて):

[ 
{'key': 'Item 1', 
    'name': 'Item 1', 
    'positions': [['00:00:00', '00:05:54'], 
       ['00:05:55', '00:07:54'], 
       ['00:16:47', '00:20:04']]}, 
{'key': 'Item 1', 
    'name': 'Item 1', 
    'positions': [['00:16:47', '00:20:04'], 
       ['00:00:00', '00:05:54'], 
       ['00:05:55', '00:07:54']]}, 
{'key': 'Item 2', 
    'name': 'Item 2', 
    'positions': [['00:07:55', '00:11:23'], ['00:11:24', '00:16:46']]}, 
{'key': 'Item 3', 'name': 'Item 3', 'positions': [['00:20:05', '00:25:56']]} 
] 

[ 
{'key': 'Item 1', 
    'name': 'Item 1', 
    'positions': [['00:00:00', '00:05:54'], 
       ['00:05:55', '00:07:54'], 
       ['00:16:47', '00:20:04']]}, 
{'key': 'Item 2', 
    'name': 'Item 2', 
    'positions': [['00:07:55', '00:11:23'], ['00:11:24', '00:16:46']]}, 
{'key': 'Item 2', 
    'name': 'Item 2', 
    'positions': [['00:11:24', '00:16:46'], ['00:07:55', '00:11:23']]}, 
{'key': 'Item 3', 'name': 'Item 3', 'positions': [['00:20:05', '00:25:56']]} 
] 

私はこれを凝視して調整していますが、3番目のインスタンスが順番に並んでいれば削除しない理由は明らかではありません(records).3つのインスタンスでは機能しますが、2つのif 3つのインスタンスを持つインスタンスが分割されます(records2)。

+0

はあなたの機能を投稿することができます:

代わりにこれを行いますか? – John

+0

それはそこにありますが、下にスクロールする必要がありますので、私は編集してより明確です。 – roy

+0

おっと、私の悪い= P – John

答えて

1

イテレータを反復処理している間は、イテレータから要素を削除しません。

def dedupe(rs): 
    delist = [] 
    new_rs = [] 
    for r in rs: 
     if r['key'] not in delist: 
      print r['key'] 
      delist.append(r['key']) 
      new_rs.append(r) 

    return new_rs 
+0

あなたはhttp: /pastebin.com/GapUXZWDまたはhttp://pastebin.com/eeLDJrDS –

+0

@PadraicCunninghamそこでは反復するrsではなく、逆の(rs)とrsから取り除く別のオブジェクトをトラバースしています – dnit13

+0

それは大丈夫ですどのdupが削除されても、終了時から削除することは安全です –

関連する問題