3

次の 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です。

4

4 に答える 4

10

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

とにかく、まったく異なる哲学を持つ言語間でコードを直接移植することは、良い方法ではありません。

于 2012-09-08T15:09:18.513 に答える
1

リスト内のすべてのオブジェクトまたは「反復可能な」ものを反復処理する場合は、「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
于 2015-06-09T14:22:25.273 に答える
0

この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 プログラムには、非常に奇妙なことがあります。

于 2012-09-08T16:53:00.900 に答える