1

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

如果我有一个清单:

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 的方法可以做到这一点,同样当我看到它时我会踢自己!

4

3 回答 3

1

我认为最 Pythonic 的选项是:

len(my_list[index+1:])

因为这描绘了您要计算的正确含义。

于 2012-09-05T14:32:16.250 回答
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
于 2012-09-05T14:34:51.977 回答
0

range切片是对(xrange在 Python 2 中)的补充:

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))))
于 2012-09-05T14:43:26.617 回答