2016-08-08 63 views
0

ich folgendes Wörterbuch haben:Entfernen Sie doppelte Einträge nach Wert aus einem Wörterbuch

potential_duplicates = { 
    432L: (u'one two three', u'one two three'), 
    433L: (u'one two three', u'one two three'), 
    434L: (u'whole foods', u'whole foods'), 
    435L: (u'whole foods', u'whole foods'), 
    437L: (u'this is a dupe', u'this is a dupe'), 
    438L: (u'this is a dupe', u'this is a dupe'), 
    439L: (u'this is a dupe', u'this is a dupe') 
} 

Grundsätzlich ich doppelte Einträge der Elemente in meiner Datenbank bin zu entfernen, so im wesentlichen ich zumindest einer von ihnen halten wollen hier, und werfen Sie den anderen in eine Liste von Duplikaten, die entfernt werden müssen.

Kann ich es mit dieser Struktur tun oder sollte ich stattdessen Listen verwenden?

+0

spielt es keine Rolle, welche der Duplikate gehalten werden? –

+0

Das klingt nach etwas, das Sie von Ihrer Datenbank verarbeiten lassen sollten. – user2357112

+0

@MarkRansom nein, tut es nicht. –

Antwort

0

Sie können dies mit zwei verschachtelten Wörterbuch-Comprehensions tun. Der innere konsolidiert die Duplikate, indem er den Schlüssel und den Wert umkehrt, und der äußere rekonstruiert ihn in der ursprünglichen Form.

>>> {k:v for v,k in {v:k for k,v in potential_duplicates.items()}.items()} 
{433L: (u'one two three', u'one two three'), 435L: (u'whole foods', u'whole foods'), 439L: (u'this is a dupe', u'this is a dupe')} 

Um eine Liste der Schlüssel zu erhalten, die entfernt wurden, eine Liste Verständnis der beiden dicts vergleichen verwenden:

>>> kept = {k:v for v,k in {v:k for k,v in potential_duplicates.items()}.items()} 
>>> removed = [k for k in potential_duplicates.keys() if k not in kept] 
>>> removed 
[432L, 434L, 437L, 438L] 
+0

Schön .. Sehr schlau. Gibt es eine Möglichkeit, die "gezupften" Duplikate in einer anderen Liste zu speichern? –

+0

@bob_cobb siehe das Update. –

+0

Mann, DANKE. Ich habe mein Gehirn dabei zerschlagen! –