我正在尝试找出如何在元组列表中使用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()
您可以将值分离到单独的列表中。
from bisect import bisect
data = [(3, 1), (2, 2), (5, 6)]
fst, snd = zip(*data)
idx = bisect(fst, 2)
但是请注意,为了使bisect
正常工作,您的数据确实应该排序...
在某些情况下,很简单
bisect(list_of_tuples, (3, None))
就足够了。
因为None
将比较小于任何整数,这将为您提供第一个元组的索引,该索引至少以3开头;如果它们都小于3,则为len(list_of_tuples)
。请注意,list_of_tuples
已排序。
检查文档的底部:http://docs.python.org/3/library/bisect.html。如果要与元素本身以外的其他元素进行比较,则应创建一个单独的所谓键列表。在您的情况下,一个仅包含元组[1]的整数列表。使用第二个列表以二分法计算索引。然后使用它既可以将元素插入到原始元素(元组列表)中,又可以将键(元组的[1])插入新的键列表中(整数列表)。
我遇到了同样的问题。我正在存储(file_id, word_frequency)
元组的列表,想获取按元组中第二个元素word_frequency
排序的列表。我进行了一些研究,发现python如何比较元组,这在此处https://howtodoinjava.com/python/compare-tuples/中进行了描述。
本质上,它查看两个元组的第一个元素,并取较小的一个。如果第一个元素相同,则将比较第二个值,依此类推。
所以我所做的就是交换了元组(word_frequency, file_id)
中的元素。现在,我使用bisect根据单词频率对列表进行了排序。
希望这会有所帮助