【问题标题】:bisect_left on first item of list within list, Python 3bisect_left 列表中列表的第一项,Python 3
【发布时间】:2021-02-05 07:02:31
【问题描述】:

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

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

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

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

关于另一种方法的任何想法,因为它有效,但是当我的列表达到 5000 项时,它非常慢,我需要一种更快的方法吗?

【问题讨论】:

    标签: python list python-3.x binary-search


    【解决方案1】:

    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)

    【讨论】:

    • 很好的答案!谢谢。
    【解决方案2】:
    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")它会知道把它放在那个项目的右边

    【讨论】:

      猜你喜欢
      • 2022-11-28
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2016-03-10
      相关资源
      最近更新 更多