Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中向排序列表中插入一项_Python_List_Sorted - Fatal编程技术网

在Python中向排序列表中插入一项

在Python中向排序列表中插入一项,python,list,sorted,Python,List,Sorted,我正在创建一个类,其中一个方法将一个新项插入到排序列表中。项目将插入到已排序列表中已更正(已排序)的位置。除了[]、[:]、+和len之外,我不允许使用任何内置的列表函数或方法。这是一个让我很困惑的部分 做这件事最好的方法是什么?提示1:您可能想在本教程中学习Python代码 提示2:可用于列表插入: >>> s = ['a', 'b', 'd', 'e'] >>> s[2:2] = ['c'] >>> s ['a', 'b', 'c', '

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


做这件事最好的方法是什么?

提示1:您可能想在本教程中学习Python代码

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

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

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

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]
使用模块的功能:

输出

[1, 2, 3, 4, 5] 

您应该使用对分模块。此外,在使用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

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

 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)`

我现在正在学习算法,所以我想知道对分模块是怎么写的。 下面是来自“对分”模块的代码,该模块使用二分法将项目插入到排序列表中:

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)
右侧的def(a、x、lo=0、hi=None): “”“在列表a中插入项目x,并假定a已排序,使其保持排序。”。 如果x已在a中,请将其插入最右侧x的右侧。 可选参数lo(默认值0)和hi(默认值len(a))绑定 要搜索的图像片段。 """ 如果lo<0: raise VALUERROR('lo必须为非负') 如果hi为无: hi=len(a) 当lo
#在排序列表中插入数字的函数
def pstatement(返回的值):
返回打印(“新排序列表=”,返回值)
def插入(输入,n):
打印('输入列表=',输入)
打印('要插入的编号=',n)
print('要迭代的范围=',len(输入))
第一个=输入[0]
打印('first element=',first)
最后=输入[-1]
打印('last element=',last)
如果第一个>n:
列表=[n]+输入[:]
返回pstatement(列表)
elif lastn:
打破
列表=输入[:i]+[n]+输入[i:]
返回pstatement(列表)
#输入值
listq=[2,4,5]
n=1
插入(列表q,n)

家庭作业?你可能会先在网上搜索如何将元素插入排序列表。我不允许使用和内置的列表函数though@FelixKlingOP表示,不允许的是让OP感到困惑的原因。在特定的背景下,任何数量的搜索都不能很好地找到关注这一点的人。不是吗最好的解决方案是,
bisect
模块将在O(logn)步中找到插入点,您的可能必须搜索整个列表,O(n)复杂度。由于OP不允许使用任何函数或方法,因此切片是将新元素插入列表的唯一方法。bisect适合于排序列表插入,但它的速度下降到了O(N),因为它使用python的基本列表。市场上有没有链接列表或类似的东西?@MaksimGayduk请在上尝试blist模块。这就是说,这篇文章的OP对允许使用哪些工具有一些相当严格的限制。当项目不是整数时,缺少该做什么。例如,我如何在现实世界的问题中使用它?@Velda这里有一个非整数的例子:
s=['a','b','d'];二等分内(s,'c');断言(s==['a','b','c','d'])
仍然是整数示例。顺便问一下,你多久整理一次信。。。?如果我想根据某个类的某些属性对其实例进行排序,该怎么办?@Velda如果您正在比较自定义类,您可以实现_lt________________________________方法和对分。这样,您。这在O(n)中运行。从算法上讲,这并不比简单地扫描列表、找到合适的位置并重新排列列表中的元素以保持排序顺序要好
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)
# 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)