-1

おそらくばかげた質問ですが、私は一般的に疑問に思っています。誰かが知っているなら、特に正規表現とテキスト解析の分野で、Pythonインタープリターがどれほどの先見性を持っているか。

ある時点で私のコードが次のようになっているとします。

mylist = ['a', 'b', 'c', ... ]

if 'g' in list: print(mylist.index('g'))

whileループなどでこれを行うためのより安全な方法はありますか?つまり、インデックスは最初から2番目の解析で検索されますか、それとも2つのg(上記の行)はPythonの頭の中で同じものですか?

4

6 に答える 6

4

両方の時間でルックアップを実行します。それが価値がある場合(たとえば、非常に大きなリストの場合)、次を使用しますtry

try:
    print(mylist.index('g'))
except ValueError:
    pass
于 2012-08-30T02:55:16.463 に答える
4

包含チェックの結果はキャッシュされないため、インデックスを新たに検出する必要があります。__contains__()また、Pythonの動的な性質により、メソッドがオブジェクトを変更する可能性があるため、そのようなものの暗黙的なキャッシュは信頼できなくなります(ただし、そうすることはいくつかのプログラミング原則に違反します)。

于 2012-08-30T02:55:38.710 に答える
1

あなたは簡単に調べるために口述をすることができます。このようなもの:

mydict = {k:v for v,k in enumerate(mylist)}

同じでいくつかのそのようなルックアップを行わない限り、作成のオーバーヘッドはdict価値がありませんlist

于 2012-08-30T04:22:01.223 に答える
1

コードは2つのルックアップになります。1つ目は「g」がリストにあるかどうかを判別し、2つ目はインデックスを検索します。Pythonは、それらを単一のルックアップに統合しようとはしません。効率が心配な場合は、リストの代わりに辞書を使用して、両方のルックアップをO(n)ではなくO(1)にすることができます。

于 2012-08-30T02:55:40.603 に答える
0

リスト内の要素のインデックスを見つけるには、より良いオプションを試してください。try:print(mylist.index('g'))ただし、ValueError:print "value not in list"
pass

于 2012-08-30T04:36:28.640 に答える
0

ええ、それは2回検索されます、pythonインタープリターは命令をキャッシュしませんが、それが可能かどうか疑問に思っています(特定の事柄について)、これが問題である場合は、両方とも定数を持つセットまたはディクテーションを使用できます時間を調べます。

いずれにせよ、あなたはLBYLのようですが、PythonではEAFPを使用する傾向があるため、そのようなものをtry ... exceptブロックでラップするのは非常に一般的です。

于 2012-08-30T05:32:04.627 に答える