【问题标题】:Using bisect in a list of tuples?在元组列表中使用 bisect?
【发布时间】:2014-01-03 16:18:23
【问题描述】:

我正在尝试弄清楚如何在元组列表中使用 bisect 例如

[(3, 1), (2, 2), (5, 6)]

如何根据每个元组中的 [1] 平分这个列表?

list_dict [(69, 8), (70, 8), ((65, 67), 6)]
tup1,tup2 (69, 8) (70, 8)
list_dict [((65, 67), 6)]
fst, snd ((65, 67),) (6,)

我正在插入平分

idx = bisect.bisect(fst, tup1[1]+tup2[1])

这给了我unorderable types: int() < tuple()

【问题讨论】:

    标签: python python-3.3


    【解决方案1】:

    在某些情况下只是简单的

    bisect(list_of_tuples, (3, None))
    

    足够了。

    因为None 将比较小于任何整数,这将为您提供第一个至少以 3 开头的元组的索引,或者如果它们都小于 3,则为len(list_of_tuples)。请注意,list_of_tuples 已排序.

    【讨论】:

    • 这在 Python 3 中不起作用。如果你传递了确切的数字 3,你将得到TypeError: unorderable types: int() < NoneType()。但是bisect(list_of_tuples, (3, )) 会没事的。
    【解决方案2】:

    您可以将值分离到单独的列表中。

    from bisect import bisect
    
    data = [(3, 1), (2, 2), (5, 6)]
    fst, snd = zip(*data)
    idx = bisect(fst, 2)
    

    但是请注意,要让bisect 工作,您的数据确实应该被订购...

    【讨论】:

    • 这个特定的方法对我不起作用,因为我每次都在更新元组,我会在编辑中解释
    • @user3157919 您需要确保您要对分的内容和正在处理的内容是分开的(并且二等分是可比较的类型),如果需要,稍后将它们重新组合在一起。 ..
    • 使用 bisect 的主要优点是线性时间搜索。以线性时间方式复制列表意味着您不妨进行线性搜索。
    【解决方案3】:

    查看文档的底部:http://docs.python.org/3/library/bisect.html。如果您想与元素本身以外的其他内容进行比较,则应创建一个单独的所谓键列表。在您的情况下,一个仅包含元组 [1] 的整数列表。使用第二个列表来计算 bisect 的索引。然后使用它来将元素插入原始(元组列表)和键(元组的 [1])到新的键列表(整数列表)中。

    【讨论】:

    • 使用 bisect 的主要优点是线性时间搜索。以线性时间方式复制列表意味着您不妨进行线性搜索。
    • @Brent 这取决于您搜索的次数。我的想法是您维护两个数据结构以协同工作。他们还不如都从空开始。
    【解决方案4】:

    建议转换输入列表的答案通过将应该是 O(log n) 的操作转换为 O(n) 操作来破坏平分的目的。更好的解决方案是在输入上使用视图:

    class _list_view:
        def __init__(self, a, key):
            self.a = a
            self.key = key
    
        def __getitem__(self, index):
            return self.key(self.a[index])
    
    
    def bisect_left(a, x, lo=0, hi=None, key=id):
        from bisect import bisect_left
        hi = hi or len(a)
        if key == id:
            return bisect_left(a, x, lo, hi)
        return bisect_left(_list_view(a, key), x, lo, hi)
    

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题。我正在存储(file_id, word_frequency) 元组的列表,并希望按元组中的第二个元素(word_frequency)对列表进行排序。我做了一些研究,发现了 python 如何比较元组,这在此处描述 https://howtodoinjava.com/python/compare-tuples/

      本质上,它查看两个元组的第一个元素并取较小的一个。如果第一个元素相同,则它会比较第二个值,依此类推。

      所以我所做的是交换元组(word_frequency, file_id) 中的元素。现在,我使用 bisect 根据词频对列表进行了排序。

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2021-06-06
        • 1970-01-01
        • 2022-06-10
        • 2010-11-23
        • 2020-08-23
        • 2013-03-11
        • 1970-01-01
        • 2014-04-27
        • 1970-01-01
        相关资源
        最近更新 更多