1

私はそのような新しい質問をお詫びしますが....

リストがある場合:

my_list = [1,2,3,4,5,6,7]

与えられたインデックスの後に残っているアイテムの数を知りたいのですが、これを行うための最もPython的な方法は何ですか?私が思いつくことができる最高のものは

remainder = len(my_list[index:])-1

さらに悪いことに:

remainder = (len(my_list) - index) -1

最初の例では、スライスが含まれているため、マジックナンバー1を追加する必要があります。2番目の例では、マジックナンバー1を使用して、インデックスがゼロベースで長さがゼロではないという事実を修正する必要があります。私はこれを行うためのより単純でよりパイソン的な方法があると確信しています、そして同様に私がそれを見るとき私は自分自身を蹴るつもりです!

4

3 に答える 3

1

最もPythonicなオプションは次のとおりです。

len(my_list[index+1:])

これはあなたが計算したいものの正しい意味を描写しているので。

于 2012-09-05T14:32:16.250 に答える
0

私は2番目のものは大丈夫だと思います:

>>> 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結果は、2番目のものがスライスを使用した最初のものよりも速いことを証明します:

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

スライスはrangexrangePython 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 に答える