辞書のリストの違い

ポップコーン :

私はかなり多くのことを検索したが、私は1つの任意の同様の質問を発見していません。

私は、次の形式で辞書の二つのリストを持っています:

data1 = [
    {'id': 4, 'date_time': datetime.datetime(2020, 4, 3, 12, 34, 40)},
    {'id': 4, 'date_time': datetime.datetime(2020, 4, 3, 12, 34, 40)},
    {'id': 6, 'date_time': datetime.datetime(2020, 4, 3, 12, 34, 40)},
    {'id': 7, 'date_time': datetime.datetime(2020, 4, 3, 16, 14, 21)},
]

data2 = [
    {'id': 4, 'date_time': datetime.datetime(2020, 4, 3, 12, 34, 40)},
    {'id': 6, 'date_time': datetime.datetime(2020, 4, 3, 12, 34, 40)},
]

所望の出力:

final_data = [
    {'id': 4, 'date_time': datetime.datetime(2020, 4, 3, 12, 34, 40)},
    {'id': 7, 'date_time': datetime.datetime(2020, 4, 3, 16, 14, 21)},
]

私がしているだけの辞書たくdata1ないではdata2

私は、ループのための2つに一致するものを見つけたとき、今までは、私は、リストの辞書のうちのポップが、その私には良い方法のように見えるしていません。どのようにして所望の出力を達成することができますか?

各リスト内の辞書の最大数十がありますので、それは時間効率的である必要はありません。


現在の実装:

counter_i = 0

for i in range(len(data1)):
    counter_j = 0
    for j in range(len(data2)):
        if data1[i-counter_i]['id'] == data2[j-counter_j]['id'] and data1[i-counter_i]['date_time'] == data2[j-counter_j]['date_time']
            data1.pop(i-counter_i)
            data2.pop(j-counter_j)
            counter_i += 1 
            counter_j += 1 
            break
schwobaseggl:

パフォーマンスが問題でない場合は、その理由ではありません。

for d in data2:
    try:
        data1.remove(d)
    except ValueError:
        pass  

list.removeオブジェクトの平等ではなく、アイデンティティをチェックし、その同じキーと値をdictsのために動作します。また、list.remove一度に一つの発生を削除します。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=399361&siteId=1