使用dict
和set
和您的代碼將更加高效地運行了很多:
from collections import defaultdict
st = set(map(tuple, listA_set))
d = defaultdict(list)
for i, ele in enumerate(map(tuple,listA)):
if ele in st:
d[ele].append(i)
print(list(d.items()))
print(list(d.values()))
輸出:
[((3, 4, 5), [1]), ((6, 7, 8), [2]), ((1, 2, 3), [0, 3])]
[[1], [2], [0, 3]]
如果你想保持第一看到的順序:
from collections import OrderedDict
d = OrderedDict()
for i, ele in enumerate(map(tuple, listA)):
if ele in st:
d.setdefault(ele, []).append(i)
print(list(d.items()))
print(list(d.values()))
輸出:
[((1, 2, 3), [0, 3]), ((3, 4, 5), [1]), ((6, 7, 8), [2])]
[[0, 3], [1], [2]]
無論您使用哪種方式枚舉,您的複雜性仍然是二次方的,這將比您自己的方法快得多。
上隨機數據集中的某些時刻:更快
In [27]: from random import randint
In [28]: listA_set = [[randint(1,20) for _ in range(10)] for _ in range(2000)]
In [29]: listA = [[randint(1,20) for _ in range(10)] for _ in range(3000)]
In [30]: %%timeit
listA_indices = []
for i in listA_set:
listA_indices.append([j[0] for j in enumerate(listA) if j[1] == i])
....:
1 loops, best of 3: 696 ms per loop
In [31]: %%timeit
st = set(map(tuple, listA_set))
from collections import OrderedDict
d = OrderedDict()
for i, ele in enumerate(map(tuple,listA)):
if ele in st:
d.setdefault(ele, []).append(i)
....:
1000 loops, best of 3: 1.49 ms per loop
~400
倍。
「我收到正確的答案,但看到速度顯着降低」 - 從不比較正確的代碼和無用的錯誤代碼的性能。如果你沒有問題,你可以在任何時候做任何事。 – user2357112