gpt4 book ai didi

Python:搜索已排序的元组列表

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:29:28 25 4
gpt4 key购买 nike

有用信息:

有关如何对各种数据类型的列表进行排序的信息,请参阅: How to sort (list/tuple) of lists/tuples?

.. 有关如何对排序列表执行二进制搜索的信息,请参阅:Binary search (bisection) in Python

我的问题:

如何巧妙地将二进制搜索(或另一种 log(n) 搜索算法)应用于某种数据类型的列表,其中键是数据类型本身的内部组件?为了使问题简单化,我们可以使用元组列表作为示例:

x = [("a", 1), ("b",2), ("c",3)]
binary_search(x, "b") # search for "b", should return 1
# note how we are NOT searching for ("b",2) yet we want ("b",2) returned anyways

为了进一步简化:我们只需要返回一个搜索结果,而不是多个搜索结果,例如 ("b",2) 和 ("b",3) 都存在。

更好的是:

我们如何修改下面的简单代码来执行上述操作?

from bisect import bisect_left

def binary_search(a, x, lo=0, hi=None): # can't use a to specify default for hi
hi = hi if hi is not None else len(a) # hi defaults to len(a)
pos = bisect_left(a, x, lo, hi) # find insertion position
return (pos if pos != hi and a[pos] == x else -1) # don't walk off the end

请注意:我不是在寻找完整的算法本身。相反,我正在寻找一些 Python 的标准(ish)库和/或 Python 的其他功能的应用程序,以便我可以随时轻松地搜索某种任意数据类型的排序列表。

谢谢

最佳答案

利用字典顺序如何处理长度不等的元组:

# bisect_right would also work
index = bisect.bisect_left(x, ('b',))

有时将自定义序列类型提供给 bisect 可能很方便:

class KeyList(object):
# bisect doesn't accept a key function, so we build the key into our sequence.
def __init__(self, l, key):
self.l = l
self.key = key
def __len__(self):
return len(self.l)
def __getitem__(self, index):
return self.key(self.l[index])

import operator
# bisect_right would *not* work for this one.
index = bisect.bisect_left(KeyList(x, operator.itemgetter(0)), 'b')

关于Python:搜索已排序的元组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45155345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com