1

私が取り組んでいるプロジェクトでは、深くネストされた辞書とリストのデータ構造を多数処理しています。多くの場合、単一のメンバーを含むリストを返すことを期待してルックアップを行っていることに気付きます。ルックアップは完全に失敗するか、まったく結果を返さない可能性があるため、次のようなコードを記述できます。

try:
    value_I_need = lookup_results[0]
except IndexError:
    # handle lookup failure, keep going

しかし最近、最初はループが 0 回または 1 回しか発生しないと仮定して、ループを作成する方が将来性があるかどうか疑問に思っていました。

value_I_need = None
for value_I_need in lookup_results:
    break
if value_I_need is None:
    # handle lookup failure, keep going

(複数の結果を含むルックアップを処理するために、このコードを書き直したり一般化したりする可能性があるため、「将来性がある」と言います。) これらの 2 つのアプローチのいずれかについて、本質的に非 Pythonic、間違った、または遅いものはありますか?

4

3 に答える 3

5

組み込み関数next()はまさにそれを行います。

a = ()
b = [1, 2, 3]
print next(iter(a), "empty") # prints "empty", as a doesn't give any values.
print next(iter(b), "empty") # prints 1, the 1st value of b
于 2012-05-30T23:07:03.123 に答える
0

なぜforですか?より明確に言えます:

if value_I_need not in lookup_results:
    print "I need it but it ain't there"

別の言い方をすれば、あなたはシーケンスを取得しません

for x in y:
    break

yがシーケンス型の場合x、最初の要素になります。dict タイプの場合、最初の要素の (ランダムな) キーになります。xそれ以前に縛られていたforものは、その後ではありません。あれは:

x = 5
for x in range(10):
     break

0 をバインドxし、最初の行にある 5 度は 2 番目の行には影響しません。

于 2012-05-30T23:00:30.917 に答える
0

シンプルで明確にしてください。

if len(lookup_results) == 1:
    result = lookup_results[0]
    # ...
else:
    # ...

ここでのパフォーマンスの違い (プラスまたはマイナス) は微視的であり、意図をより明確に伝えます。

後でリファクタリングする必要がある場合、これらの方法で記述しても、それに費やす時間に大きな影響はありません (もちろん、コードが何をしているのかわからない場合を除きます)。

于 2012-05-30T23:09:26.913 に答える