假设我有一个列表[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)
sorted与切片一起使用:
l[:1] + sorted(l[1:])
Run Code Online (Sandbox Code Playgroud)
输出:
[2, 1, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1283 次 |
| 最近记录: |