次の Java イディオムを Python にどのように翻訳しますか?
Comparable[] a, int lo, int hi;
int i = lo, j = hi+1;
Comparable v = a[lo];
while (a[++i] < v) if (i == hi) break;
++i
私の問題は、 while テストではorを持てないことi += 1
です。
次の Java イディオムを Python にどのように翻訳しますか?
Comparable[] a, int lo, int hi;
int i = lo, j = hi+1;
Comparable v = a[lo];
while (a[++i] < v) if (i == hi) break;
++i
私の問題は、 while テストではorを持てないことi += 1
です。
Python でそのようにできない問題は、Python 構文の制限です。while
ドキュメントからどのように見えるかを見てみましょう:
while_stmt ::= "while" expression ":" suite
["else" ":" suite]
ご覧のとおり、「 : 」の前に式を配置する必要があります。 whileはステートメントです (ステートメントは値を返さないため、条件として使用できません)。x += 1
このコードは Python では次のようになります。
i += 1
while a[i] < v:
if i == hi:
break
i += 1
動作しますが、問題を解決するための Python の方法ではない可能性が最も高いです。for
コレクションがあり、インデックスを使用したい場合は、ループとenumerate
組み込み関数を使用してコードを再設計することを楽しみにする必要があります。
PS
とにかく、まったく異なる哲学を持つ言語間でコードを直接移植することは、良い方法ではありません。
リスト内のすべてのオブジェクトまたは「反復可能な」ものを反復処理する場合は、「for item in list」を使用します。カウンターも必要な場合は、enumerate を使用します。数値の範囲が必要な場合は、range または xrange を使用します。
しかし、元のポスターの例のように、ブレークまたはリターンでブレークアウトするカウンターが上がるだけのループが本当に必要な場合があります。
このような場合に備えて、単純なジェネレーターを定義して、カウンターをインクリメントするのを忘れないようにしています。
def forever(start=0):
count = start
while True:
yield count
count += 1
次に、次のように書くだけです。
for count in forever():
if do_something() == some_value:
break
return count
このlist
クラスには、この種の検索を行う組み込みメソッドがありますが、何らかの理由で、等しいかどうかのみを比較します。もちろん、次のようにハッキングできます。
class hax:
def __init__(self, value): self.value = value
def __eq__(self, other): return other >= self.value
a.index(hax(a[lo]), lo + 1, hi + 1)
...しかし、しないでください:)
とにかく、@Rostyslavが示唆するように、コードを直接移植しようとするべきではないだけでなく、実際に問題を直接移植しようとするべきではありません。このような問題が発生するような方法でリストを使用する Python プログラムには、非常に奇妙なことがあります。