搜索大列表

时间:2018-12-27 15:30:50

标签: python list search

我有一个坐标列表(如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项的大列表,它花费的时间太长。我认为问题在于通过列表进行搜索,因为随着列表的增加,它使用的时间也会更长。

2 个答案:

答案 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