0

假设我有这个列表:

l = [5, 4, 2, 7, 1, 8]

我想保留 2 和 1 以及它们之间的所有内容并删除其他所有内容,实现此目的最优雅的方法是什么?我想得到的是这样的:

l = [2, 7, 1]

换句话说,我知道左侧项目的价值和右侧项目的价值,我需要它们以及介于两者之间的所有内容。其余的应该删除。

这并不优雅,但速度很快

start = l.index(2)
del l[:start]

end = l.index(1)
del l[end+1:]

这看起来很pythonic,但是很慢:

l = [val for val in l if l.index(2) <= l.index(val) <= l.index(1)]

对于 10000 个整数的列表,第一个整数的速度要快 100 倍,而且更丑陋。如何两全其美?

编辑:

我决定尝试不同的答案,看看它们跑得有多快。

s = l.index(start)                         #1
e = l.index(end, start) + 1
l = l[s:e]

l = l[l.index(start):l.index(end)+1]       #2
l[:] = l[l.index(start):l.index(end)+1]    #3

当列表的长度在 1000 万数量级并且起点的索引以百万为单位时,1 与 2 相比变得显着。最多(有 1000 万个整数的列表),我们谈论的是使用一个线程的速度非常快的笔记本电脑可以提高百分之几秒的性能。

3 显然是最慢的并且使用最多的内存。

4

2 回答 2

4
l[l.index(start): l.index(end) + 1]

这个怎么样?

于 2013-08-27T06:40:30.327 回答
1

1您可以从索引开始扫描,2而不是从头开始

L = [5, 4, 2, 7, 1, 8]
start = L.index(2)
end = L.index(1, start) + 1
L[start: end]
于 2013-08-27T11:50:12.930 回答