将列表从一个索引排序到另一个索引 - python

nwi*_*e13 18 python sorting

假设我有一个列表[2, 4, 1, 3, 5]

我想将列表从索引 1 排序到末尾,这给了我 [2, 1, 3, 4, 5]

我怎么能用python3做到这一点?

(没有额外的空间将不胜感激)

编辑:

我已将切片声明为已接受的答案。Python 仅复制对象引用,因此与真正的就地排序相比,速度损失不会那么大。但是如果你需要一个非常严格的解决方案,你可以参考@Heap Overflow 上我最喜欢的答案之一

>>> tmp = l[0]
>>> l[0] = float('-inf')
>>> l.sort()
>>> l[0] = tmp
>>> l
[2, 1, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

U10*_*ard 17

特尔;博士:

sorted与切片分配一起使用以保留原始列表对象而不创建新对象:

l = [2, 4, 1, 3, 5]
l[1:] = sorted(l[1:])
print(l)
Run Code Online (Sandbox Code Playgroud)

输出:

[2, 1, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

更长的答案:

创建列表后,我们将进行切片分配:

l[1:] = 
Run Code Online (Sandbox Code Playgroud)

现在您可能想知道[1:]它是做什么的,它正在对列表进行切片并从第二个索引开始,因此第一个索引将被删除。Python 的索引从零开始,:意味着获取之前索引之后的所有内容,但如果是[1:3]这样,它将只获取索引1和之间的值,3假设您的列表是:

l = [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

如果您使用:

print(l[1:])
Run Code Online (Sandbox Code Playgroud)

这将导致:

[2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

如果你使用:

print(l[1:3])
Run Code Online (Sandbox Code Playgroud)

这将导致:

[2, 3]
Run Code Online (Sandbox Code Playgroud)

关于切片,如果您愿意,请在此处阅读更多内容。

切片后我们有一个等号=,它只是简单地将=符号之前的内容更改为符号之后的内容=,因此在这种情况下,我们使用l[1:],然后给出[2, 3, 4, 5],它将更改为=符号之后的内容。

如果您使用:

l[1:] = [100, 200, 300, 400]
print(l)
Run Code Online (Sandbox Code Playgroud)

这将导致:

[1, 100, 200, 300, 400]
Run Code Online (Sandbox Code Playgroud)

要了解有关它的更多信息,请查看此内容

之后,我们得到了sorted,这是默认的内置函数,它简单地将列表从小到大排序,假设我们有以下列表:

l = [3, 2, 1, 4]
Run Code Online (Sandbox Code Playgroud)

如果您使用:

print(sorted(l))
Run Code Online (Sandbox Code Playgroud)

这将导致:

[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

要了解有关它的更多信息,请查看这里

之后我们回到关于切片的第一个主题,使用l[1:],但是从这里您知道它不仅用于赋值,您还可以对其应用函数并处理它,就像我们在这里使用sorted.


Kel*_*ndy 10

也许暂时把比其他东西小的东西放在那里?应该比其他解决方案更快。并且在使用或时尽可能接近您的“无多余空格”愿望。sortsorted

>>> tmp = l[0]
>>> l[0] = float('-inf')
>>> l.sort()
>>> l[0] = tmp
>>> l
[2, 1, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)


基准

对于示例列表,1,000,000 次迭代(当然我只准备了一次该特殊值):

  sort_u10 0.8149 seconds
sort_chris 0.8569 seconds
 sort_heap 0.7550 seconds
sort_heap2 0.5982 seconds   # using -1 instead of -inf
Run Code Online (Sandbox Code Playgroud)

对于 50,000 个列表,例如[int(x) for x in os.urandom(100)]

  sort_u10 0.4778 seconds
sort_chris 0.4786 seconds
 sort_heap 0.8106 seconds
sort_heap2 0.4437 seconds   # using -1 instead of -inf
Run Code Online (Sandbox Code Playgroud)

基准代码:

import timeit, os

def sort_u10(l):
    l[1:] = sorted(l[1:])

def sort_chris(l):
    l = l[:1] + sorted(l[1:])

def sort_heap(l, smallest=float('-inf')):
    tmp = l[0]
    l[0] = smallest
    l.sort()
    l[0] = tmp

def sort_heap2(l):
    tmp = l[0]
    l[0] = -1
    l.sort()
    l[0] = tmp

for _ in range(3):
    for sort in sort_u10, sort_chris, sort_heap, sort_heap2, sort_rev:
        number, repeat = 1_000_000, 5
        data = iter([[2, 4, 1, 3, 5] for _ in range(number * repeat)])
        # number, repeat = 50_000, 5
        # data = iter([[int(x) for x in os.urandom(100)] for _ in range(number * repeat)])
        t = timeit.repeat(lambda: sort(next(data)), number=number, repeat=repeat)
        print('%10s %.4f seconds' % (sort.__name__, min(t)))
    print()
Run Code Online (Sandbox Code Playgroud)


Chr*_*ris 8

sorted与切片一起使用:

l[:1] + sorted(l[1:])
Run Code Online (Sandbox Code Playgroud)

输出:

[2, 1, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)