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