我有一个包含元组的大列表myList
。
我需要删除此列表中的重复项(即具有相同元素且顺序相同的元组)。我还需要在单独的列表indexList
中跟踪此列表的索引。如果删除重复项,则需要将其在indexList
中的索引更改为第一个相同值的索引。
为了证明我的意思,如果myList
看起来像这样:
myList = [(6, 2), (4, 3), (6, 2), (8, 1), (5, 4), (4, 3), (2, 1)]
然后我需要像这样构造indexList
:
indexList = (0, 1, 0, 2, 3, 1, 4)
此处的第三个值与第一个相同,因此它(第三个值)获得索引0
。此外,后续值还会获得更新后的索引2
,依此类推。
这是我实现这一目标的方法:
unique = set()
i = 0
for v in myList[:]:
if v not in unique:
unique.add(v)
indexList.append(i)
i = i+1
else:
myList.pop(i)
indexList.append(myList.index(v))
这可以满足我的需求。但是,当index()
包含成千上万个元素时,myList
方法会使脚本非常慢。据我了解,这是因为它是O(n) operation
。
那我可以做些什么改变来获得相同的结果,但是更快呢?
答案 0 :(得分:1)
如果您决定存储每个值的第一个索引,则可以在O(1)
中而不是O(n)
中进行查找。因此,在这种情况下,在for循环之前,执行indexes = {}
,然后在if
块中执行indexes[v] = i
,在else
块中使用indexes[v]
的myList.index(v)
。