问题
I'm trying to figure out how to use bisect in a list of tuples for example
[(3, 1), (2, 2), (5, 6)]
How can I bisect this list according to the [1] in each tuple?
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,)
And I'm inserting to bisect
idx = bisect.bisect(fst, tup1[1]+tup2[1])
Which gives me unorderable types: int() < tuple()
回答1:
You can separate out the values into separate lists.
from bisect import bisect
data = [(3, 1), (2, 2), (5, 6)]
fst, snd = zip(*data)
idx = bisect(fst, 2)
Note however, that for bisect to work, your data really should be ordered...
回答2:
In some cases just the simple
bisect(list_of_tuples, (3, None))
will be enough.
Because None will compare less than any integer, this will give you the index of the first tuple starting with at least 3, or len(list_of_tuples) if all of them are smaller than 3. Note that list_of_tuples is sorted.
回答3:
Check the bottom section of the documentation: http://docs.python.org/3/library/bisect.html. If you want to compare to something else than the element itself, you should create a separate list of so-called keys. In your case a list of ints containing only [1] of the tuple. Use that second list to compute the index with bisect. Then use that to both insert the element into the original (list of tuples) and the key ([1] of the tuple) into the new list of keys (list of ints).
来源:https://stackoverflow.com/questions/20908047/using-bisect-in-a-list-of-tuples