在元组列表中使用bisect?

时间:2014-01-03 16:18:23

标签: python python-3.3

我试图找出如何在元组列表中使用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,)

我正在插入bisect

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

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

5 个答案:

答案 0 :(得分:10)

在某些情况下只是简单的

bisect(list_of_tuples, (3, None))

就够了。

因为None将比任何整数都小,所以这将为您提供以至少3开头的第一个元组的索引,如果所有这些都小于3,则为len(list_of_tuples)。注意{ {1}}已排序。

答案 1 :(得分:4)

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

from bisect import bisect

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

但是请注意,要使bisect生效,您的数据确实应该被订购......

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

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

希望这会有所帮助

答案 4 :(得分:0)

建议转换输入列表的答案通过将应为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)