2016-05-11 7 views
3

Beispiel 1 erscheinen:Python/Sammlungen - Entfernen Sie Elemente, die gleiche Anzahl, wie oft

import collections 

list = ['Mike', 'Mike', 'Mike', 'Jhon', 'Jhon', 'Rob', 'Rob', 'Carl', 'Carl'] 
list_counter = collections.Counter(list) 
>> Counter({'Mike': 3, 'Rob': 2, 'Jhon': 2, 'Carl': 2}) 

Beispiel 2:

import collections 
list = ['Sam', 'Sam', 'Sam', 'Sam', 'Mike', 'Mike', 'Mike', 'Jhon', 'Jhon', 'Rob', 'Rob'] 
list_counter = collections.Counter(list) 
>> Counter({'Sam': 4, 'Mike': 3, 'Rob': 2, 'Jhon': 2}) 

Alles, was ich tun möchte, ist, wenn in der Liste occours 2 zu überprüfen oder mehr Elemente die gleiche Anzahl von Malen, und löschen Sie sie.

In Beispiel 1 Rob, Jhon und Carl würden entfernt werden, sie sind 3 Elemente, die 2 mal in der Liste erscheint. In Beispiel 2 würden Rob und Jhon entfernt werden, während Sam und Mike in Ordnung wären und in der Liste bleiben würden. Wenn in der Liste nur 1 Element erscheint (zum Beispiel Jhon n mal), würde nichts entfernt werden.

+0

Haben Sie etwas versucht? –

+0

Eigentlich habe ich keine Ahnung, ich weiß nur, dass ich jedes Element Ereignis mit list_counter ["Sam"] zum Beispiel – Hyperion

+0

einfach retrive können Sie Elemente mit nur Count 2 löschen, nicht mehr und nicht weniger? –

Antwort

1

Wenn Sie alle Namen entfernen möchten, die mindestens zweimal mit der gleichen Frequenz erscheinen:

import collections 

lst = ['Mike', 'Mike', 'Mike', 'Jhon', 'Jhon', 'Rob', 'Rob', 'Carl', 'Carl', 
     "foo","foo","foo","foo","bar", "bar", "bar", "bar"] 
list_counter = collections.Counter(lst) 

# count the frequency 
times = collections.Counter(list_counter.values()) 

# keep names that do not appear at the same frequency as any other names 
lst[:] = [name for name,v in list_counter.items() if times[v] < 2] 
print(lst) 

, die Sie mit verlassen würde:

['Mike'] 

Wenn Sie möchten, stellt auch sicher, die Anzahl ist nicht 1:

[name for name, v in list_counter.items() if v == 1 or times[v] < 2] 

Wenn Sie alle Mikes dann iterieren der Liste behalten möchten:

import collections 

lst = ['Mike', 'Mike', 'Mike', 'Jhon', 'Jhon', 'Rob', 'Rob', 'Carl', 'Carl', 
     "foo","foo","foo","foo","bar", "bar", "bar", "bar"] 
list_counter = collections.Counter(lst) 
times = collections.Counter(list_counter.values()) 

lst[:] = [name for name in lst if times[list_counter[name]] < 2] 
print(lst) 

Was Sie geben würde:

['Mike', 'Mike', 'Mike'] 
0

, wenn ich es richtig wollen Sie diese Namen behalten, was mehr als 2 mal occure. In diesem Fall:

[x for x,y in list_counter.iteritems() if y>2] 
+1

Es ist nicht "mehr als 2 mal"; es ist die gleiche Anzahl von Malen wie etwas anderes. Beachten Sie, Mike bleibt in beiden Beispielen. – zondo

0
import collections 
your_list = ['Sam', 'Sam', 'Sam', 'Sam', 'Mike', 'Mike', 'Mike', 'Jhon', 'Jhon', 'Rob', 'Rob'] 
list_counter = collections.Counter(your_list) 
filtered_list = [item for item in your_list if list_counter.get(item) != 2] 
result = list(set(filtered_list)) 

Die gefilterte Liste ist eine Python-Liste Verständnis Art und Weise, wenn Ihr Listenelement Zähler = zwei 2.en

Bei Beispiel wird auf dem Vergleich.

[ 'Mike', 'Mike', 'Mike']

jetzt

tun

Liste (set (filtered_list))

[ 'Mike']

sollten Sie nicht Benenne deine Variablen wie 'Liste'.

1

Mein Ansatz war es, erste Gruppe alle Elemente mit gleichen count in defaultdict Objekt, dann resultierenden Wörterbuch bauen basierte auf einer Filterbedingung:

>>> from collections import Counter, defaultdict 
>>> 
>>> lst = ['Mike', 'Mike', 'Mike', 'Jhon', 'Jhon', 'Rob', 'Rob', 'Carl', 'Carl'] 
>>> c = Counter(lst) 
>>> c 
Counter({'Mike': 3, 'Carl': 2, 'Rob': 2, 'Jhon': 2}) 
>>> 
>>> d = defaultdict(list) 
>>> 
>>> for k,v in c.items(): 
     d[v].append(k) 
>>> 
>>> d 
defaultdict(<class 'list'>, {2: ['Jhon', 'Rob', 'Carl'], 3: ['Mike']}) 
>>> 
>>> result = dict((*v,k) for k,v in d.items() if len(v) < 2) 
>>> result 
{'Mike': 3} 
>>> 
+0

Dies ist eigentlich O (n^2), mit Zählern zu tun ist die Zählung ist O (n) –

+0

@PadraicCunningham .. yea ... Sie haben Recht ... Ich werde versuchen, das zu beheben .. –

+0

Erstellen Sie Ihre zählt zuerst dann mach deine Lookups. –

1

Sie können .values() mit all den verschiedenen Mengen finden und dann macht eine Liste Verständnis der Werte, die >= 2 mal erscheinen:

values = collections.Counter(list_counter.values()) 
result = [item for item in list if values[item] >= 2] 

ich nicht list als Variablennamen, jedoch verwenden würde, becaus e Es schattiert den eingebauten Typ.

Verwandte Themen