Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:搜索已排序的元组列表_Python_Algorithm_List_Search - Fatal编程技术网

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

Python:搜索已排序的元组列表,python,algorithm,list,search,Python,Algorithm,List,Search,有用信息: 有关如何对各种数据类型列表进行排序的信息,请参阅: 。。有关如何对排序列表执行二进制搜索的信息,请参阅: 我的问题: 如何将二进制搜索(或另一个log(n)搜索算法)巧妙地应用于某个数据类型的列表,其中键是数据类型本身的内部组件?为了简化问题,我们可以使用元组列表作为示例: x = [("a", 1), ("b",2), ("c",3)] binary_search(x, "b") # search for "b", should return 1 # note how we ar

有用信息:

有关如何对各种数据类型列表进行排序的信息,请参阅:

。。有关如何对排序列表执行二进制搜索的信息,请参阅:

我的问题:

如何将二进制搜索(或另一个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',))
有时可以方便地将自定义序列类型馈送到
对分

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')

把元组列表转换成dict怎么样

>>> d = dict([("a", 1), ("b",2), ("c",3)])
>>> d['b'] # 2

这里的问题是,我正在处理大量的列表(>1000000),这种操作太慢了。不过我很感谢你的回答。将简单二进制搜索算法的第5行修改为:pos=bisect_left(a,(x,),lo,hi)#查找插入位置。。。没有达到预期效果,返回一个-1未找到。@斯蒂芬拉斯基:我只是告诉你如何找到索引。您的
二进制搜索
函数还有其他问题;例如,它直接将
x
a[pos]
进行比较,因此它不知道是否找到了正确的条目。我错了,一切都很正常。出于好奇:你怎么能修改上面的属性来搜索第n个位置呢?@Stephenasky:我不知道你在说什么。