如何通过大列表的Index()方法规避慢速搜索

时间:2019-05-05 00:15:56

标签: python

我有一个包含元组的大列表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

那我可以做些什么改变来获得相同的结果,但是更快呢?

1 个答案:

答案 0 :(得分:1)

如果您决定存储每个值的第一个索引,则可以在O(1)中而不是O(n)中进行查找。因此,在这种情况下,在for循环之前,执行indexes = {},然后在if块中执行indexes[v] = i,在else块中使用indexes[v]myList.index(v)