2016-01-17 45 views
5

Jestem nowy w Pythonie i staram się nauczyć go jak najwięcej. Utknąłem z niemądrym problemem, w którym chcę usunąć niektóre pozycje słownika z listy na podstawie selektywnych par klucz-wartość. Dla ex, mam:Jak usunąć zduplikowany słownik na podstawie wybranych kluczy z listy słowników w Pythonie?

l = [{'A':1, 'B':2, 'C':3, 'D':4}, 
    {'A':5, 'B':6, 'C':7, 'D':8}, 
    {'A':1, 'B':9, 'C':3, 'D':10}] 

a wyjście chcę jest usunięcie słowników opartych na dwóch kluczy A i C wartości:

l = [{'A':1, 'B':2, 'C':3, 'D':4}, 
    {'A':5, 'B':6, 'C':7, 'D':8}] 
+0

Wygląda na to, że chcesz zachować pierwszą parę (A, C). Czy to prawda? Czy potrzebujesz zachować zamówienie? – DSM

+0

Tak @ DSM Potrzebuję tylko tych słowników na mojej ostatecznej liście, które mają unikalną parę (A, C) par klucz-wartość. Nie, zamówienie nie jest ważne. –

+0

Tak, jasne jest, że potrzebujesz tylko * jednego * z wielu możliwych słowników z tą samą parą (A, C). Ale czy zawsze musisz mieć * pierwszy *, czy też '{'A': 1, 'B': 9, 'C': 3, 'D': 10}' działały równie dobrze? – DSM

Odpowiedz

5

Korzystanie set do zapamiętania, czy elementy są widoczne.

>>> A, B, C, D = 'ABCD' 
>>> 
>>> lst = [ 
...  {A:1, B:2, C:3, D:4}, 
...  {A:5, B:6, C:7, D:8}, 
...  {A:1, B:9, C:3, D:10} 
... ] 
>>> seen = set() 
>>> [x for x in lst if [(x[A], x[C]) not in seen, seen.add((x[A], x[C]))][0]] 
[{'A': 1, 'C': 3, 'B': 2, 'D': 4}, {'A': 5, 'C': 7, 'B': 6, 'D': 8}] 
+0

Dzięki @falsetru za rozwiązanie. To zadziałało jak urok! :) –

+0

Jaki jest cel "A, B, C, D =" ABCD "? Chcę tego użyć, ale klucze mojego dicta to konkretne ciągi np. 'slotSentence'. –