3

Pythonでクイックソートのパーティション関数を実装しようとしています。

def partition(ls):
  if len(ls) == 0:
    return
  pivot = ls[0]
  i, j = 1
  while j < len(ls):
    if ls[j] <= pivot:
      i += 1
      temp = ls[i]
      ls[i] = ls[j]
      ls[j] = temp
    j += 1
  ls[0] = ls[i]
  ls[i] = pivot

ただし、Pythonを呼び出すと、このエラーが発生しますquicksort.partition([1,2,3])

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "quicksort.py", line 5, in partition
    i, j = 1
TypeError: 'int' object is not iterable

このエラーは何を言っていますか?もちろん、intオブジェクトは反復可能ではありませんが、intオブジェクトを反復処理したのはいつですか。

4

3 に答える 3

10

割り当ての左側にコンマで区切られた複数のターゲットをリストすると、右側を繰り返し処理して、左側のピースにピースを割り当てようとします。したがって、x, y = (1, 2)そうすると、xは1になり、yは2になります。

iとjの両方を1にしたい場合は、を実行しますi = j = 1

(これにより、両方の変数が同じオブジェクトにバインドされることに注意してください。この場合は問題ありませんが、(のようなx = y = [])可変オブジェクトを割り当てる場合は、xとyの両方が同じリストを指すため、突然変異は両方に影響することに注意してください。xおよびy。)

于 2012-06-23T19:31:12.527 に答える
3
i, j = 1

このコードは(機能的に)次のものと同等です。

i = None
for a in 1:
    if i != None and j != None:
        break
    if i == None:
        i = a
    else
        j = a

もちろん、これは違法であり、1反復可能ではありません。それが通訳があなたに言っていることです。

あなたが欲しいものは:

i = j = 1
于 2012-06-23T19:33:21.493 に答える
2
>>> i,j=1,2
>>> i,j=[1,2]
>>> i,j=(1,2)
>>> i,j='12'
>>> i,j={1,2}
>>> i,j={'x':1,'y':1}

これらすべてに問題なく動作します

したがってi,j、割り当てのタイプは、右側に=2つのコンマ区切り値またはiterable2つの値を指定した場合にのみ機能します。

于 2012-06-23T19:42:20.530 に答える