Saya ingin membandingkan dua kamus yang memiliki daftar nilai sebagai berikut: dict1 = {'111': [], '333': ['a@a.com'], '444': ['b@b.com ', 'c@c.com'], '555': ['d@d.com']} dict2 = {'111': ['e@e.com'], '...

1
Ajay Misra 5 April 2021, 22:26

3 jawaban

Jawaban Terbaik

Jika Anda ingin mempertahankan urutan yang sama di result_dict seperti pada dict asli (dict2, maksud saya):

result_dict = {
    k: v if k not in dict1 else [a for a in v if a not in dict1[k]]
    for k, v in filter(lambda x: len(set(x[1]).difference(dict1.get(x[0], []))), dict2.items())
}

Di sini result_dict:

{'111': ['e@e.com'], '333': ['f@f.com'], '444': ['g@g.com']}
1
PieCot 5 April 2021, 19:44

Anda dapat memfilter item mana pun yang nilainya cocok, lalu dalam pemahaman dict, kunci baru harus set.difference untuk kunci yang sesuai.

>>> {k:list(set(v).difference(dict1[k])) for k,v in dict2.items() if dict1[k] != v}
{'111': ['e@e.com'], '333': ['f@f.com'], '444': ['g@g.com']}
0
Cory Kramer 5 April 2021, 19:31

Anda dapat menggunakan pemahaman kamus:

dict1 = {'111': [], '333': ['a@a.com'], '444': ['b@b.com', 'c@c.com'], '555': ['d@d.com']}
dict2 = {'111': ['e@e.com'], '333': ['f@f.com' ], '444': ['b@b.com', 'g@g.com'], '555': ['d@d.com']}
r = {a:[i for i in b if i not in j] for a, b in dict2.items() if (j:=dict1.get(a, [])) != b}

Keluaran:

{'111': ['e@e.com'], '333': ['f@f.com'], '444': ['g@g.com']}
0
Ajax1234 5 April 2021, 19:28