list中list的第一项上的bisect_left,Python 3

ygya80vv  于 2023-01-06  发布在  Python
关注(0)|答案(3)|浏览(135)

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

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

并且我需要= bisect_left每个元组的第一个元素来找到列表中的索引,但是,如果不事先创建一个包含所有这些第一个元素的列表,我想不出一种方法来完成这个任务:
第一个月
任何想法的另一种方式来做这件事,因为它的工作,但当我的名单得到5000项长,这是非常缓慢的,我需要一个更快的方式来做它?

6qqygrtg

6qqygrtg1#

Python有一个内置的bisect_left,你可以使用它,你不需要构建整个中间列表,你只需要一个lazy对象,它从元组中检索该位置的第一个元素。
一些简单的事情,比如:

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

从Python 3.10的bisect开始,你可以使用use a key function for the search,所以不再需要 Package 器,在你的例子中,它是key=operator.itemgetter(0)

ioekq8ef

ioekq8ef2#

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"),它会知道将其放在该项的右侧

w46czmvw

w46czmvw3#

L = [(0, "test1", "value1"), (1, "test2", "value2"), (3, "test3", "value3")]

来自Python 3.10

print(bisect_left(L, 4, key = itemgetter(0))) # output : 3

对于Python 3.10以下版本,另一种方法是使用zip函数

a, _, _ = zip(*L)

print(bisect_left(a, 2)) # output : 2
print(bisect_left(a, 4)) # output : 3

相关问题