スクリプトは今働いていない理由を説明するために、私は、変数の名前を変更しますunsorted
しsorted
。
最初は、リストはまだソートされていません。もちろん、に設定sorted
しFalse
ます。
while
ループを開始するとすぐに、リストが既にソートされていると想定します。アイデアは次のとおりです。正しい順序になっていない2つの要素が見つかるとすぐに、にsorted
戻しFalse
ます。間違った順序で要素がなかった場合にのみsorted
残ります。True
sorted = False # We haven't started sorting yet
while not sorted:
sorted = True # Assume the list is now sorted
for element in range(0, length):
if badList[element] > badList[element + 1]:
sorted = False # We found two elements in the wrong order
hold = badList[element + 1]
badList[element + 1] = badList[element]
badList[element] = hold
# We went through the whole list. At this point, if there were no elements
# in the wrong order, sorted is still True. Otherwise, it's false, and the
# while loop executes again.
また、コードをより効率的または読みやすくするための小さな問題もあります。
でfor
ループ、変数を使用しますelement
。技術的にelement
は、は要素ではありません。リストのインデックスを表す数値です。また、かなり長いです。このような場合は、i
"index"のように、一時的な変数名を使用してください。
for i in range(0, length):
range
また、このコマンドは(名前はただ一つの引数を取ることができますstop
)。その場合、0からその引数までのすべての整数のリストを取得します。
for i in range(length):
Pythonのスタイルガイドは、変数はアンダースコアと小文字で命名することをお勧めします。これは、このような小さなスクリプトの非常にマイナーなヒントです。Pythonコードが最もよく似ているものに慣れるためのものです。
def bubble(bad_list):
2つの変数の値を交換するには、それらをタプル割り当てとして記述します。右側はタプルとして評価され(たとえば(badList[i+1], badList[i])
is (3, 5)
)、次に左側の2つの変数に割り当てられます((badList[i], badList[i+1])
)。
bad_list[i], bad_list[i+1] = bad_list[i+1], bad_list[i]
すべてをまとめると、次のようになります。
my_list = [12, 5, 13, 8, 9, 65]
def bubble(bad_list):
length = len(bad_list) - 1
sorted = False
while not sorted:
sorted = True
for i in range(length):
if bad_list[i] > bad_list[i+1]:
sorted = False
bad_list[i], bad_list[i+1] = bad_list[i+1], bad_list[i]
bubble(my_list)
print my_list
(ちなみに、私もあなたの印刷文を削除しました。)