我赞成这样一个新问题,但......
如果我有一个清单:
my_list = [1,2,3,4,5,6,7]
并且我想知道在给定索引之后还剩下多少项,这样做的最pythonic方式是什么?我能想到的最好的是
remainder = len(my_list[index:])-1
甚至更糟:
remainder = (len(my_list) - index) -1
在第一个例子中,我必须添加幻数1,因为切片是包含的,在第二个例子中,我必须使用幻数1来纠正索引为零且长度不是的事实!我确信有一种更简单,更pythonic的做法,同样地,当我看到它时,我会踢自己!
答案 0 :(得分:1)
我认为最Pythonic选项是:
len(my_list[index+1:])
因为这描绘了你想要计算的正确含义。
答案 1 :(得分:0)
我猜第二个很好:
>>> my_list = [1,2,3,4,5,6,7]
>>> length=len(my_list)
>>> index=2
>>> length-(index+1) #remaining elements are [4,5,6,7]
4
>>> index=4
>>> length-(index+1) #remaining elements are [6,7]
2
Timeit
结果,证明第二个比切片第一个更快:
import random
def func1():
lis=list(xrange(100))
for i in xrange(100):
index=random.randrange(0,100)
remainder = len(lis[index:])-1
def func2():
lis=list(xrange(100))
for i in xrange(100):
index=random.randrange(0,100)
remainder = (len(lis) - index) -1
if __name__ == '__main__':
from timeit import Timer
t = Timer("func2()", "from __main__ import func2")
print t.timeit()
t = Timer("func1()", "from __main__ import func1")
print t.timeit()
<强>输出:强>
47.001240015
52.2959749699
答案 2 :(得分:0)
切片是range
(Python 2中的xrange
)的补充:
len(range(index + 1, len(my_list)))
为您提供my_list[index + 1:]
的长度。
更准确(允许例如负端指数)您可以使用:
len(range(*slice(index + 1, None).indices(len(my_list))))
NumPy具有优雅的s_
对象,可将切片索引转换为切片对象:
import numpy as np
len(range(*np.s_[index + 1:].indices(len(my_list))))