删除元组中的以下重复项

时间:2016-04-29 10:13:46

标签: python arrays tuples

我有任意大小的元组。这是一个例子:

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

对于x轴标记,我想将此元组转换为:

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

因此,在元组大小保持不变的情况下,应删除重复项。有没有一种简单的方法可以做到这一点?

2 个答案:

答案 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添加到集seenseen.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 seenFalse(即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']