2015-03-25 6 views
6

Ich versuchte mit set() Methode von Python, die eindeutigen Elemente in der Liste zu finden. Es funktioniert einwandfrei alle Duplikate zu entfernen. Aber hier ist meine Anforderung, ich möchte die Elemente erhalten, die mit der Methode set() entfernt werden. Könnte mir bitte jemand dabei helfen?Wie identifiziert man die Elemente, die in python aus set() entfernt werden?

a=[1,2,3,1,4] 
b=set(a) 
Output:[1,2,3,4] 

My erwartete Ausgang ist [1] .Der Element, das aus dem Verfahren entfernt wird set()

+2

Was passiert, wenn der Eingang '[1,2,3,1,4, 1, 1]'? – thefourtheye

+3

Erhalten Sie ihre Zählung und überprüfen Sie die Elemente mit der Zählung> 1. –

Antwort

1

können Sie Set-Klasse erweitern (haben eine eigene Set-Klasse sagen MySet) und überschreiben diese Funktion

def _update(self, iterable): 
    # The main loop for update() and the subclass __init__() methods. 
    data = self._data 

    # Use the fast update() method when a dictionary is available. 
    if isinstance(iterable, BaseSet): 
     data.update(iterable._data) 
     return 

    value = True 

    if type(iterable) in (list, tuple, xrange): 
     # Optimized: we know that __iter__() and next() can't 
     # raise TypeError, so we can move 'try:' out of the loop. 
     it = iter(iterable) 
     while True: 
      try: 
       for element in it: 
        data[element] = value 
       return 
      except TypeError: 
       transform = getattr(element, "__as_immutable__", None) 
       if transform is None: 
        raise # re-raise the TypeError exception we caught 
       data[transform()] = value 
    else: 
     # Safe: only catch TypeError where intended 
     for element in iterable: 
      try: 
       data[element] = value 
      except TypeError: 
       transform = getattr(element, "__as_immutable__", None) 
       if transform is None: 
        raise # re-raise the TypeError exception we caught 
       data[transform()] = value 
+0

so ist Ihre Antwort im Grunde "etwas in diesen 35 Zeilen Code ändern"? ... – shx2

+0

Ja, weil das ist, was die Frage war. Für diejenigen, die Counter verwendet haben, glaube ich, dass Sie eine Alternative gegeben haben, anstatt auf das zu antworten, was gefragt wurde (mit zusätzlichen Loops usw.) Danke für die Down-Abstimmung btw :) –

2

collections.Counter nützlich ist hier.

from collections import Counter 
counts = Counter(a) 
b = set(counts.keys()) 
for x, count in counts.items(): 
    if count > 1: 
     print('%d appearances of %s were removed in the set' % (count-1, x)) 
2

Sie brauchen nicht einmal festgelegt. Sie möchten eine Zählung jedes Elements mit mehr als einem Vorkommen durchführen. Zähler aus Sammlungen zusammen mit einem Wörterbuchverständnis sollten Sie dorthin bringen.

from collections import Counter 

a = [1, 1, 1, 2, 2, 3, 4]  
removed = {k: v-1 for k, v in Counter(a).iteritems() if v > 1} 

>>> removed 
Out[8]: {1: 2, 2: 1} 
1

Dies wird eine Reihe zurückkehren nur die Elemente aus dem ursprünglichen Satz entfernt enthält:

>>> a = [1, 2, 3, 4, 1, 1, 5] 

>>> set(i for i in a if a.count(i) > 1) 

>>> {1} 
1

Ich denke, Sie nähern sich dem Problem in einer leicht zusammengesetzten Art und Weise. Anstatt zu versuchen, eine set() etwas zu tun, was es nicht tun soll (eine Liste von Duplikaten zurückgeben), würde ich eine collections.Counter() verwenden, um die Duplikate zu sammeln und dann das Set daraus zu bekommen.

Hier einige Code:

#!python 
from collections import Counter 
c = Counter([1,2,3,1,4]) 
dupes = [k for k,v in c.items() if v>1] 
b = set(c.keys()) 
2

dieses Versuchen mit Counter

from collections import Counter 
a = [1, 2, 3, 1, 4] 
>>>[i for i in Counter(a) if Counter(a)[i] > 1] 
[1] 
Verwandte Themen