我有一个坐标列表(如x和y:coordinates = [[1, 2], [2, 3]]
,但更大),它会更新每次迭代(追加新列表)。因此,我需要搜索current_pos
中是否有[4, 10]
(也像coordinates
这样的列表)。这是我的代码片段:
for move in range(len(movement_string)):
# ...
# code changes current_pos
# ...
if current_pos in coordinates:
fail = True
failed_move = move + 1
break
else:
coordinates.append(current_pos)
对于小列表,它可以很好地工作,但是对于包含10.000-1.000.000项的大列表,它花费的时间太长。我认为问题在于通过列表进行搜索,因为随着列表的增加,它使用的时间也会更长。
答案 0 :(得分:1)
只需将coordinates
变成set
coordinates = set()
,将current_pos
设为tuple
,以便将其插入set
中。在某个时候:
current_pos = tuple(current_pos)
然后您的循环变为:
for move in range(len(movement_string)):
# ...
# code changes current_pos
# ...
if current_pos in coordinates:
fail = True
failed_move = move + 1
break
else:
coordinates.add(current_pos)
就是这样。您将获得O(1)
查找,因此它不取决于coordinates
集的长度。
如果顺序很重要,只需如上所述创建一个set
并保留list
即可附加(如果尚未看到的话)(如此处How do you remove duplicates from a list whilst preserving order?所述)。
答案 1 :(得分:0)
如果顺序很重要,则开箱即用的解决方案是OrderedDict,它记住插入顺序,并且仍然具有O(1)查找。您还需要将坐标作为元组,因此它们将是不可变的(与可变列表相对)。
插入字典将是:
>>> from collections import OrderedDict
>>> points = OrderedDict()
>>> points[(1,2)] = 1 #The value assigned to the key not matter in this example
>>> points[(-1,3)] = 1
>>> list(points)
[(1, 2), (-1, 3)
抬头只是
>>> point = (3,4)
>>> point in points
False