在Python中将项目插入到排序列表中

时间:2011-11-06 01:14:13

标签: python list sorted

我正在创建一个类,其中一个方法将新项目插入到排序列表中。该项目将插入已排序列表中的已更正(已排序)位置。我不允许使用[][:]+len以外的任何内置列表函数或方法。这是让我感到困惑的部分。

解决这个问题的最佳方式是什么?

8 个答案:

答案 0 :(得分:71)

提示1:您可能希望在bisect module中学习Python代码。

提示2:Slicing可用于列表插入:

>>> s = ['a', 'b', 'd', 'e']
>>> s[2:2] = ['c']
>>> s
['a', 'b', 'c', 'd', 'e']

答案 1 :(得分:66)

使用insort模块的bisect功能:

>> import bisect 
>> a = [1, 2, 4, 5] 
>> bisect.insort(a, 3) 
>> print(a) 
[1, 2, 3, 4, 5] 

答案 2 :(得分:30)

您应该使用bisect模块。此外,在使用bisect.insort_left

之前,需要对列表进行排序

这是一个非常大的差异。

>>> l = [0, 2, 4, 5, 9]
>>> bisect.insort_left(l,8)
>>> l
[0, 2, 4, 5, 8, 9]

timeit.timeit("l.append(8); l = sorted(l)",setup="l = [4,2,0,9,5]; import bisect; l = sorted(l)",number=10000)
    1.2235019207000732

timeit.timeit("bisect.insort_left(l,8)",setup="l = [4,2,0,9,5]; import bisect; l=sorted(l)",number=10000)
    0.041441917419433594

答案 3 :(得分:1)

这是一个可能的解决方案:

a = [15, 12, 10]
b = sorted(a)
print b # --> b = [10, 12, 15]
c = 13
for i in range(len(b)):
    if b[i] > c:
        break
d = b[:i] + [c] + b[i:]
print d # --> d = [10, 12, 13, 15]

答案 4 :(得分:1)

我现在正在学习算法,所以我想知道bisect模块的编写方式。 这是bisect模块中的有关将项目插入已排序列表的代码,该代码使用二分法:

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)

答案 5 :(得分:0)

# function to insert a number in an sorted list


def pstatement(value_returned):
    return print('new sorted list =', value_returned)


def insert(input, n):
    print('input list = ', input)
    print('number to insert = ', n)
    print('range to iterate is =', len(input))

    first = input[0]
    print('first element =', first)
    last = input[-1]
    print('last element =', last)

    if first > n:
        list = [n] + input[:]
        return pstatement(list)
    elif last < n:
        list = input[:] + [n]
        return pstatement(list)
    else:
        for i in range(len(input)):
            if input[i] > n:
                break
    list = input[:i] + [n] + input[i:]
    return pstatement(list)

# Input values
listq = [2, 4, 5]
n = 1

insert(listq, n)

答案 6 :(得分:0)

嗯,有很多方法可以做到这一点,这里有一个简单的天真的程序,使用内置的 Python 函数 sorted() 来做同样的事情

def sorted_inserter():
list_in = []
n1 = int(input("How many items in the list : "))

for i in range (n1):
    e1 = int(input("Enter numbers in list : "))
    list_in.append(e1)
print("The input list is : ",list_in)


print("Any more items to be inserted ?")
n2 = int(input("How many more numbers to be added ? : "))
for j in range (n2):
    e2= int(input("Add more numbers : "))
    list_in.append(e2)
    list_sorted=sorted(list_in)
    print("The sorted list is: ",list_sorted)
    

sorted_inserter()

输出是

列表中有多少项:4

在列表中输入数字:1

在列表中输入数字:2

在列表中输入数字:123

在列表中输入数字:523

输入列表为:[1, 2, 123, 523]

还有什么要插入的项目吗?

要添加多少个数字? :1

添加更多数字:9

排序后的列表为:[1, 2, 9, 123, 523]

答案 7 :(得分:-5)

这是附加列表并将值插入排序列表的最佳方法:

 a = [] num = int(input('How many numbers: ')) for n in range(num):
     numbers = int(input('Enter values:'))
     a.append(numbers)

 b = sorted(a) print(b) c = int(input("enter value:")) for i in
 range(len(b)):
     if b[i] > c:
         index = i
         break d = b[:i] + [c] + b[i:] print(d)`