Python:搜索元组的排序列表

时间:2017-07-17 23:55:55

标签: python algorithm list search

有用的信息:

有关如何对各种数据类型列表进行排序的信息,请参阅: 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的其他功能,以便我可以随时轻松搜索某些任意数据类型的排序列表。

由于

2 个答案:

答案 0 :(得分:2)

利用词典排序如何处理不等长的元组:

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

答案 1 :(得分:1)

如何将元组列表转换为字典?

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