bisect模块可以使列表保持已排好的顺序,使用二分算法。bisect(list,item,[low,[high]]) 返回要插入item点的索引,如果item在列表中了,则返回该条目的右边索引bisect_right(list,iten,[left,[right]]) 同上bisect_left(list,iten,[left,[right]]) 返回要插入item点的索引,如果item在列表中了,则返回该条目的左边索引insort(list,item,[left,[right]]) 不返回索引,直接插入进去,如果有重复的item,则插入到右边insort_right(list,item,[left,[right]]) 同上insort_left(list,item,[left,[right]]) 不返回索引,直接插入进去,如果有重复的item,则插入到左边下面是整个模块在linux python2.6版本的源码:"""Bisection algorithms."""def insort_right(a, x, lo=0, hi=None): """Insert item x in list a, and keep it sorted assuming a is sorted. If x is already in a, insert it to the right of the rightmost x. Optional args lo (default 0) and hi (default len(a)) bound the slice of a to be searched. """ if lo 0: raise ValueError('lo must be non-negative') if hi is None: hi = len(a) while lo hi: mid = (lo+hi)//2 if x a[mid]: hi = mid else: lo = mid+1 a.insert(lo, x)insort = insort_right # backward compatibilitydef bisect_right(a, x, lo=0, hi=None): """Return the index where to insert item x in list a, assuming a is sorted. The return value i is such that all e in a[:i] have e a[i:] have e > x. So if x already appears in the list, a.insert(x) will insert just after the rightmost x already there. Optional args lo (default 0) and hi (default len(a)) bound the slice of a to be searched. """ if lo 0: raise ValueError('lo must be non-negative') if hi is None: hi = len(a) while lo hi: mid = (lo+hi)//2 if x a[mid]: hi = mid else: lo = mid+1 return lobisect = bisect_right # backward compatibilitydef insort_left(a, x, lo=0, hi=None): """Insert item x in list a, and keep it sorted assuming a is sorted. If x is already in a, insert it to the left of the leftmost x. Optional args lo (default 0) and hi (default len(a)) bound the slice of a to be searched. """ if lo 0: raise ValueError('lo must be non-negative') if hi is None: hi = len(a) while lo hi: mid = (lo+hi)//2 if a[mid] x: lo = mid+1 else: hi = mid a.insert(lo, x)def bisect_left(a, x, lo=0, hi=None): """Return the index where to insert item x in list a, assuming a is sorted. The return value i is such that all e in a[:i] have e a[i:] have e >= x. So if x already appears in the list, a.insert(x) will insert just before the leftmost x already there. Optional args lo (default 0) and hi (default len(a)) bound the slice of a to be searched. """ if lo 0: raise ValueError('lo must be non-negative') if hi is None: hi = len(a) while lo hi: mid = (lo+hi)//2 if a[mid] x: lo = mid+1 else: hi = mid return lo# Overwrite above definitions with a fast C implementationtry: from _bisect import bisect_right, bisect_left, insort_left, insort_right, insort, bisectexcept ImportError: pass 10-08 03:16