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")
它会知道把它在那个项目的右边
我有一个这样的列表,例如:
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")
它会知道把它在那个项目的右边