2016-04-29 11 views
2

Ich habe Tupel beliebiger Größe. Dies ist ein Beispiel:Entfernen Sie die folgenden Duplikate in einem Tupel

ax = ('0','1','1','1','2','2','2','3') 

Für x-Achse Beschriftung ich dieses Tupel konvertieren möchten:

ax = ('0','1','','','2','','','3') 

So sollten Duplikate gelöscht werden, während die Tupel Größe gleich bleiben sollte. Gibt es einen einfachen Weg, das zu tun?

+1

Nur eine kleine Sache: Ich glaube, das ist ein Tupel, und keine Liste. Es gibt einige subtile Unterschiede, aber für diese Frage spielt es keine Rolle. – dvaergiller

Antwort

4
In [12]: seen = set() 

In [13]: [x if x not in seen and not seen.add(x) else '' for x in ax] 
Out[13]: ['0', '1', '', '', '2', '', '', '3'] 

Dies ist eine leicht modifizierte Version eines uniquifier von Dave Kirby, here vorgeschlagen.


seen.add(x) fügt x den Satz seen. Die Methode seen.add gibt None zurück. Also in einem booleschen Kontext, (bool(None) ist False), not seen.add(x) ist immer True. Deshalb ist die Bedingung

x not in seen and not seen.add(x) 

hat einen Booleschen Wert, der gleich

x not in seen and True 

die zu

entspricht
x not in seen 

So ist der Bedingungsausdruck

x if x not in seen and not seen.add(x) else '' 

kehrt x wenn x nicht bereits in seen ist und '' zurückgibt, wenn x bereits in seen ist (und x dann zu seen hinzugefügt wird). Wenn x not in seen ist False (das heißt, wenn x bereits in seen) dann seen.add(x) wird nicht genannt, weil der Python and Kurzschlüssen - jeder Ausdruck der Form False and something automatisch False ohne eine ist mit something zu bewerten.


Dies auch geschrieben werden kann, nicht so kurz und bündig, aber ohne die Komplexität, wie

def replace_dupes(ax): 
    result = [] 
    seen = set() 
    for x in ax: 
     if x in seen: 
      result.append('') 
     else: 
      seen.add(x) 
      result.append(x) 
    return result 

ax = ('0','1','1','1','2','2','2','3') 
print(replace_dupes(ax)) 
# ['0', '1', '', '', '2', '', '', '3'] 
+2

was "nicht gesehen.add (x)" tut? –

+0

'Die Add-Funktion gibt None zurück, ist dies nur für gesetzt? –

+0

Python-Methoden aus der Standardbibliothek folgen im Allgemeinen dem [Kommando-Abfrage-Trennprinzip] (https://en.wikipedia.org/wiki/Command%E2%80%93query_separation). Methoden, die das Objekt modifizieren (d. H.commands) gibt 'None' zurück, während Methoden, die das Objekt abfragen, einen Wert zurückgeben und keine Nebenwirkungen haben. 'list.sort' und' dict.update' sind ebenfalls Beispiele für Methoden, die das Objekt modifizieren und 'None' zurückgeben. – unutbu

1

Wenn Sie nur für benachbarte Duplikate suchen, dann könnte man den Einsatz von Python groupby Funktion macht wie folgt :

from itertools import groupby 

ax = ['0', '1', '1', '1', '2', '2', '2', '3'] 
ax_output = [] 

for k, g in groupby(ax): 
    ax_output.extend([k] + [''] * (len(list(g))-1)) 

print ax_output 

Dies würde Ihnen die folgende Liste:

['0', '1', '', '', '2', '', '', '3']  
Verwandte Themen