Porównywanie dwóch list słowników.

0

Mam 2 listy:

a = [{'a': 2}, {'s':5}}]
b =  [{'a': 2},{'s':5},{'c': 'z}',{'m': 111}}]

Chcę , aby w liście c były słowniki {'c': 'z}',{'m': 111}:

c = [{'c': 'z}',{'m': 111}]

czyli te słowniki z b, których nie ma w a.
Jak to zrobić? Chodzi , aby klucze były różne.

0

Najpierw popraw składnię, a potem przedstaw, jak to próbowałeś zrobić lub jaki masz pomysł.

1

Jak wszystkie słowniki na liście mają tylko jeden klucz i jedną wartość, to możesz je zamienić na krotkę (k, v), która już jest haszowalna, więc możesz z nich zrobić set i zastosować operacje mnogościowe, a na końcu zamienić znowu na słownik.

>>> a = [{'a': 2}, {'s': 5}]
>>> b = [{'a': 2}, {'s': 5}, {'c': 'z'}, {'m': 111}]
>>> set(next(iter(d.items())) for d in a)
{('a', 2), ('s', 5)}
>>> set(next(iter(d.items())) for d in b)
{('a', 2), ('m', 111), ('s', 5), ('c', 'z')}
>>> [{k: v} for k, v in set(next(iter(d.items())) for d in b) - set(next(iter(d.items())) for d in a)]
[{'m': 111}, {'c': 'z'}]
0

po prstu jet to lista kanałów tv: nazwa:url

0

Spearhead o to chodziło. Dzięki.

0

Nie prościej w te sposób?

[i for i in b if i not in a]
0

Spearhead ,jednak ty robisz tylko różnicę krotek. Mi chodzi o to, że w dwóch listach przy tych samych kluczach mogą być różne wartości. Chcę tylko listę takich słowników, których kluczy nie ma w piewrszej liście. Wartości mnie nie interesują.
a = [{kanał1: url1}, {kanał2: url2}]
b = [{kanał1: url10}, {kanał2: url22},{kanał3: url2}]
, to
c = [{kanał3: url2}]

1

Zakładając, że zawsze masz słowniki jednoelementowe:

from itertools import chain

a = [{'kanal1': 'url1'}, {'kanal2': 'url2'}]
b = [{'kanal1': 'url10'}, {'kanal2': 'url22'}, {'kanal3': 'url2'}]

c = [i for i in b if list(i.keys())[0] not in list(chain.from_iterable([list(i.keys()) for i in a]))]
0

Sprawdziłem poradę Pyxis. Działa w pythonie 3.5. W 2.7 jest błędny wynik. Dzięki.

0
xenix33 napisał(a):

[...] Chcę tylko listę takich słowników, których kluczy nie ma w piewrszej liście. Wartości mnie nie interesują.
a = [{kanał1: url1}, {kanał2: url2}]
b = [{kanał1: url10}, {kanał2: url22},{kanał3: url2}]
, to
c = [{kanał3: url2}]

>>> a = [{'kanał1': 'url1'}, {'kanał2': 'url2'}]

>>> b = [{'kanał1': 'url10'}, {'kanał2': 'url22'}, {'kanał3': 'url2'}]

>>> S = {key for d in a for key in d}

>>> c = [{key: d[key]} for d in b for key in d if key not in S]

>>> c
[{'kanał3': 'url2'}]

>>> c = [d for d in b for key in d if key not in S]

>>> c
[{'kanał3': 'url2'}]

>>> 

1 użytkowników online, w tym zalogowanych: 0, gości: 1