我有以下串列:
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})
但我只想在這里識別反向重復的索引。有更好的方法嗎?提前致謝。
uj5u.com熱心網友回復:
將串列變成一個集合,使成員資格測驗變得高效。
在迭代串列時不要從串列中洗掉,因此將要保留的元素附加到新串列中。
execlist = []
set1 = set(list1)
newlist1 = []
for i, x in enumerate(list1):
if x[::-1] in set1:
execlist.append(i)
else:
newlist1.append(x)
uj5u.com熱心網友回復:
您可以將元組用作字典的鍵,因此創建一個字典,其中排序的元組是鍵,值是該元組在串列中出現的第一個索引。然后,當您遇到字典中已經存在的元組時,您可以將索引添加到輸出串列中:
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]您在代碼中已有的內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/427610.html
