我有任意大小的元组。这是一个例子:
ax = ('0','1','1','1','2','2','2','3')
对于x轴标记,我想将此元组转换为:
ax = ('0','1','','','2','','','3')
因此,在元组大小保持不变的情况下,应删除重复项。有没有一种简单的方法可以做到这一点?
答案 0 :(得分: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']
这是Dave Kirby, here建议的uniquifier的略微修改版本。
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
尚未在x
中,会返回seen
,如果''
已经在x
seen
,则会返回x
然后被添加到seen
)。如果x not in seen
为False
(即x
已经在seen
中),则seen.add(x)
未被调用,因为Python and
}短路 - 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']
答案 1 :(得分:1)
如果您只是在寻找相邻的重复项,那么您可以使用Python的groupby
函数,如下所示:
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
这会给你以下列表:
['0', '1', '', '', '2', '', '', '3']