如何获取列表中反向重复项的索引



我有以下列表:

list1 =[('a','b'),('c','d'),('e','f'),('g','h'),('b','a'),('e','d'),('e','g'),('h','g')]

我希望将此列表中反向重复的索引添加到后面。例如:

('a','b') == ('b','a')
('g','h') == ('h','g')

我试过

exec =[]
for i,x in enumerate(list1):
z=x[::-1]
if z in list1:
exec.append(i)
list1.remove(z)

我得到了:

exec
[0, 3]

这是正确的。然而,当在列表的1000万个元素上运行时,这是非常低效的。我知道我可以通过以下方式直接删除反向重复:

data = list({tuple(sorted(item)) for item in list1})

但我只想在这里确定反向重复的索引。有更好的方法吗?提前谢谢。

将列表转换为一个集合,以提高成员身份测试的效率。

在对列表进行迭代时,不要从列表中删除,所以要将保留的元素附加到新列表中。

execlist = []
set1 = set(list1)
newlist1 = []
for i, x in enumerate(list1):
if x[::-1] in set1:
execlist.append(i)
else:
newlist1.append(x)

您可以使用元组作为字典的键,因此创建一个字典,其中排序的元组是键,值是该元组在列表中出现的第一个索引。然后,当您遇到字典中已经存在的元组时,可以将索引添加到输出列表中:

indices_dict = {}
dup_indices = []
for index, item in enumerate(list1):
s_item = tuple(sorted(item))
if s_item in indices_dict:
dup_indices.append(indices_dict[s_item])
else:
indices_dict[s_item] = index

这就产生了

dup_indices = [0, 3]

如果您只关心反向重复,即如果[('a','b'), ('a','b')]应该返回一个空列表,请将s_item = tuple(sorted(item))更改为s_item = item[::-1],就像您的代码中已经存在的那样。

最新更新