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']
Это немного измененная версия uniquifier предложенной Dave Kirby, here.
seen.add(x)
добавляет x
множеству seen
. Метод seen.add
возвращает None
. Итак, в булевом контексте, (с bool(None)
- False
), not seen.add(x)
всегда True
. Поэтому условие
x not in seen and not seen.add(x)
имеет логическое значение, равное
x not in seen and True
, которое эквивалентно
x not in seen
Так условное выражение
x if x not in seen and not seen.add(x) else ''
возвращается, если x
еще не находится в seen
и возвращает ''
, если x
уже в seen
(и x
затем добавляется к seen
). Если x not in seen
является False
(то есть, если x
уже в seen
), то seen.add(x)
не вызывается, потому что and
короткого замыкания языка Python - любое выражение вида False and something
автоматически False
без одного, имеющего оценить something
.
Это также может быть написан, а не сжато, но без сложности, так как
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']
Просто маленькая вещь: я считаю, что это кортеж, а не список. Есть некоторые тонкие различия, но для этого вопроса это может не иметь значения. – dvaergiller