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']
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