计算给定索引中列表中剩余项目的数量

时间:2012-09-05 14:30:19

标签: python

我赞成这样一个新问题,但......

如果我有一个清单:

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的做法,同样地,当我看到它时,我会踢自己!

3 个答案:

答案 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))))