我有以下列表:
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]
,就像您的代码中已经存在的那样。