Rozważ następujące:

[
  [
    {'name': 'fred', 'score': 19},
    {'name': 'frank', 'score': 100},
    {'name': 'bob', 'score': 99}
  ],
  [
    {'name': 'frank', 'score': 100},
    {'name': 'fred', 'score': 19},
    {'name': 'bob', 'score': 99}
  ],
  [
    {'name': 'bob', 'score': 99},
    {'name': 'frank', 'score': 100},
    {'name': 'fred', 'score': 19}
  ],
  [
    {'name': 'fred', 'score': 19},
    {'name': 'frank', 'score': 100},
    {'name': 'stu', 'score': 69}
  ]
]

Ignorując kolejność słowników na każdej liście, w jaki sposób można usunąć duplikaty, tak aby wynikiem były tylko dwie z list: jedna z bob i jedna ze stu?

Wpisz coś takiego:

[
  [
    {'name': 'fred', 'score': 19},
    {'name': 'frank', 'score': 100},
    {'name': 'bob', 'score': 99}
  ],
  [
    {'name': 'fred', 'score': 19},
    {'name': 'frank', 'score': 100},
    {'name': 'stu', 'score': 69}
  ]
]
-1
user13029880 9 marzec 2020, 03:42

2 odpowiedzi

Najlepsza odpowiedź

Mógłbyś spróbować czegoś takiego

dict_list =   [[{'name': 'fred', 'score': 19},
  {'name': 'frank', 'score': 100},
  {'name': 'bob', 'score': 99}],
 [{'name': 'frank', 'score': 100},
  {'name': 'fred', 'score': 19},
  {'name': 'bob', 'score': 99}],
 [{'name': 'bob', 'score': 99},
  {'name': 'frank', 'score': 100},
  {'name': 'fred', 'score': 19}],
 [{'name': 'fred', 'score': 19},
  {'name': 'frank', 'score': 100},
  {'name': 'stu', 'score': 69}]]

# create list of names you've seen before
name_lists = []
# create lists of unique lists
unique_lists = []

# loop over each list you have
for L in dict_list:

    # get list of names
    names = [i['name'] for i in L]

    # check if you've seen this set of names before
    if set(names) not in [set(n) for n in name_lists]:
        print(names)
        # save these names
        name_lists.append(names)
        # add this list to your list of unique names
        unique_lists.append(L)

Wynik:

['fred', 'frank', 'bob']
['fred', 'frank', 'stu']

unique_lists Wynik:

[[{'name': 'fred', 'score': 19},
  {'name': 'frank', 'score': 100},
  {'name': 'bob', 'score': 99}],
 [{'name': 'fred', 'score': 19},
  {'name': 'frank', 'score': 100},
  {'name': 'stu', 'score': 69}]]

Zwróć uwagę, że ta metoda zapisze wyniki tylko dla pierwszego zestawu unikatowych nazw i odrzuci wyniki, gdy zestaw nazw zostanie zduplikowany. Jeśli oczekuje się, że te same nazwy mogą mieć różne wyniki, możesz zapisać każdy unikalny zestaw wyników. W takim przypadku możesz postępować zgodnie z metodą podaną przez PacketLoss poniżej:

name_lists = []
unique_lists = []


for di, d in enumerate(dict_list):

    # get list of name, score tuples
    r = [(i['name'], i['score']) for i in d]
    # sort tuples alphabetically by name
    r.sort(key=lambda tup: tup[0])

    # check if these names and scores have been seen before
    if r not in name_lists:
        name_lists.append(r)
        unique_lists.append(dict_list[di])
-1
Eric M 9 marzec 2020, 02:52

Ponieważ kolejność jest wyłączona, proste == nie będzie pasować. Możemy obejść ten problem, zbierając dane, sortując je jako listę krotek i sprawdzając, czy dopasowanie było wcześniej widziane.

data = [[{'name': 'fred', 'score': 19},
  {'name': 'frank', 'score': 100},
  {'name': 'bob', 'score': 99}],
 [{'name': 'frank', 'score': 100},
  {'name': 'fred', 'score': 19},
  {'name': 'bob', 'score': 99}],
 [{'name': 'bob', 'score': 99},
  {'name': 'frank', 'score': 100},
  {'name': 'fred', 'score': 19}],
 [{'name': 'fred', 'score': 19},
  {'name': 'frank', 'score': 100},
  {'name': 'stu', 'score': 69}]]

seen = list()
result = list()

for idx, d in enumerate(data):
    r = [(i['name'], i['score']) for i in d]
    r.sort(key=lambda tup: tup[0])
    if r not in seen:
        seen.append(r)
        result.append(data[idx])

Dzięki tej metodzie sprawdzamy, czy zarówno wyniki, jak i nazwy są całkowicie zgodne, co oznacza, że jeśli jeden wynik w duplikacie zostanie zmieniony na 98, nie będzie już liczony jako duplikat.

Wynik:

[[{'name': 'fred', 'score': 19}, {'name': 'frank', 'score': 100}, {'name': 'bob', 'score': 99}], [{'name': 'fred', 'score': 19}, {'name': 'frank', 'score': 100}, {'name': 'stu', 'score': 69}]]

Dane wyjściowe z modyfikacją wyników w danych:

data = [[{'name': 'fred', 'score': 19},
  {'name': 'frank', 'score': 100},
  {'name': 'bob', 'score': 99}],
 [{'name': 'frank', 'score': 100},
  {'name': 'fred', 'score': 19},
  {'name': 'bob', 'score': 99}],
 [{'name': 'bob', 'score': 98},
  {'name': 'frank', 'score': 100},
  {'name': 'fred', 'score': 19}],
 [{'name': 'fred', 'score': 19},
  {'name': 'frank', 'score': 100},
  {'name': 'stu', 'score': 69}]]

[[{'name': 'fred', 'score': 19}, {'name': 'frank', 'score': 100}, {'name': 'bob', 'score': 99}], [{'name': 'bob', 'score': 98}, {'name': 'frank', 'score': 100}, {'name': 'fred', 'score': 19}], [{'name': 'fred', 'score': 19}, {'name': 'frank', 'score': 100}, {'name': 'stu', 'score': 69}]]
-1
PacketLoss 9 marzec 2020, 01:09