回答:
>>> lst = list(range(165))
>>> lst[0::10]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160]
これは、ループして各要素の係数をチェックするよりも約100倍速いことに注意してください。
$ python -m timeit -s "lst = list(range(1000))" "lst1 = [x for x in lst if x % 10 == 0]"
1000 loops, best of 3: 525 usec per loop
$ python -m timeit -s "lst = list(range(1000))" "lst1 = lst[0::10]"
100000 loops, best of 3: 4.02 usec per loop
0
冗長ですl[0::10]
。l[::10]
読みやすく、混乱が少なくなります。
source_list[::10]
が最も明白ですが、これはイテラブルでは機能せず、大きなリストではメモリ効率が良くありません。itertools.islice(source_sequence, 0, None, 10)
イテラブルで機能し、メモリ効率が良いですが、大きなリストと大きなステップに対するおそらく最速のソリューションではありません。(source_list[i] for i in xrange(0, len(source_list), 10))
次のようにスライス演算子を使用できます。
l = [1,2,3,4,5]
l2 = l[::2] # get subsequent 2nd item
L[2::2]
範囲関数のステップパラメーターを使用して取得しないのはなぜですか?
l = range(0, 1000, 10)
比較のために、私のマシンでは:
H:\>python -m timeit -s "l = range(1000)" "l1 = [x for x in l if x % 10 == 0]"
10000 loops, best of 3: 90.8 usec per loop
H:\>python -m timeit -s "l = range(1000)" "l1 = l[0::10]"
1000000 loops, best of 3: 0.861 usec per loop
H:\>python -m timeit -s "l = range(0, 1000, 10)"
100000000 loops, best of 3: 0.0172 usec per loop
existing_list = range(0, 1001)
filtered_list = [i for i in existing_list if i % 10 == 0]
これは、メンバーシップテストの一部としてリストの内容を使用しない、「10番目ごとの項目」リスト内包のより良い実装です。
>>> l = range(165)
>>> [ item for i,item in enumerate(l) if i%10==0 ]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160]
>>> l = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
>>> [ item for i,item in enumerate(l) if i%10==0 ]
['A', 'K', 'U']
しかし、これは単にリストのスライスを使用するよりもはるかに遅いです。
リスト内包表記は、まさにそのために作られています。
smaller_list = [x for x in range(100001) if x % 10 == 0]
これらの詳細については、Pythonの公式ドキュメントをご覧ください。http: //docs.python.org/tutorial/datastructures.html#list-comprehensions