9

何かよりも「小さい」値のリストをカット/スライスするために、Pythonに事前に作成された最適化されたツール/ライブラリはありますか?

ここに問題があります: 次のようなリストがあるとしましょう:

a=[1,3,5,7,9]

6の数字をすべて削除したい<=ので、結果のリストは次のようになります

[7,9]

index(6)6はリストにないので、リストの組み込みメソッドが使えません。次のようなことができます。

#!/usr/bin/env python
a = [1, 3, 5, 7, 9]
cut=6
for i in range(len(a)-1, -2, -1):
    if a[i] <= cut:
        break
b = a[i+1:]
print "Cut list: %s" % b

切り取り元のインデックスがリストの末尾に近い場合、これはかなり迅速な方法ですが、アイテムがリストの先頭に近い場合は非効率的です (たとえば、あるすべてのアイテムを削除したいとします)。>2、多くの反復があります)。

二分探索などを使用して独自の find メソッドを実装することもできますが、他のケースで再利用できるこのタイプのものを処理するための、より広い範囲の組み込みライブラリがあるかどうか疑問に思っていました (たとえば、であるすべての番号を削除する必要があります>=6)。

前もって感謝します。

4

5 に答える 5

6

bisect モジュールを使用して、ソートされた検索を実行できます。

>>> import bisect
>>> a[bisect.bisect_left(a, 6):]
[7, 9]
于 2012-11-29T17:54:13.823 に答える
5

bisect.bisect_leftあなたが探しているものだと思います。

于 2012-11-29T17:53:10.257 に答える
3

特定の基準を満たすすべての要素のリストをフィルタリングするだけの場合、最も簡単な方法は組み込みfilter関数を使用することです。

次に例を示します。

a_list = [10,2,3,8,1,9]

# filter all elements smaller than 6:
filtered_list = filter(lambda x: x<6, a_list)

にはfiltered_list次が含まれます。

 [2, 3, 1]

注:このメソッドはリストの順序に依存しないため、リストが非常に大きい場合は、( bisectなどの) 順序付けされた検索用に最適化されたメソッドの方が速度の面で優れている可能性があります。

于 2012-11-29T18:04:12.853 に答える
1

Jonの答えに加えて、実際に6未満の要素を削除する必要があり、新しいものを返すのではなく、リストへの同じ参照を保持したい場合。

del a[:bisect.bisect_right(a,6)]

bisectソートされたリストでのみ機能することにも注意してください。

于 2012-11-29T18:05:03.370 に答える