在元组列表中使用二等分吗?

问题描述 投票:12回答:4

我正在尝试找出如何在元组列表中使用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
4个回答
5
投票

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

from bisect import bisect

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

但是请注意,为了使bisect正常工作,您的数据确实应该排序...


13
投票

在某些情况下,很简单

bisect(list_of_tuples, (3, None))

就足够了。

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


2
投票

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


0
投票

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

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

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

希望这会有所帮助

© www.soinside.com 2019 - 2024. All rights reserved.