bisect_left 列表中列表的第一项,Python 3

bisect_left on first item of list within list, Python 3

我有一个这样的列表,例如:

L = [(0, "test", "value"), (0, "test2", "value2")]

我需要 = bisect_left 每个元组的第一项才能在列表中找到索引。但是,如果不事先创建所有这些第一项的列表,我想不出这样做的方法:

exampleList = [L[i][0] for i in range(len(L))]

有没有关于另一种方法的想法,因为它可以工作,但是当我的列表长到 5000 个项目时,它非常慢,我需要一种更快的方法吗?

Python有内置的bisect_left,你可以使用它。您不需要构建整个中间列表,您只需要一个从该位置的元组中检索第一项的惰性对象。

像这样简单的东西:

class Proxy(object):
    def __getitem__(self, item):
        return L[item][0]

从 Python 3.10 的 bisect 开始,您可以 use a key function for the search,因此不再需要包装器。在您的情况下,它将是 key=operator.itemgetter(0).

import bisect
L = [(0, "test", "value"), (1, "test2", "value2"),(3,"test3","value3")]
print (bisect.bisect_left(L,(2,)))

python 处理元组比较很棒...只需传递它 (2,"asd","dsa") 或什至只是 (2,) (或您要查找的任何索引位置项)

或者你可以传递它 (0,"asd","value") 它会知道把它放在另一个 (0,"test","value") 项元组的左边......或者 (0,"zzzz","value") 它会知道把它在那个项目的右边