エラーを誤って報告しました。について文句を言うのではなく、(lower-case-l)を定義してから大文字の L で呼び出そうとしたためk
、文句を言います。Python 変数は大文字と小文字が区別されます。smallerList
smallerlist
smallerlist is smallerList == False
あなたのコードを見る:
def quickSelect(lines, k):
if len(lines) != 0:
len(lst) != 0
非慣用的です。lst
PEP-8 は、 のようにであるべきだと言っていif lst:
ます。また、camelCase は非 Pythonic です。関数名はquick_select
. lines
テキストのみを操作できることを意味しますが、関数は順序付け可能なデータ型でも同様に機能するため、items
より正確になります。次の人がそれが何をするかを理解できるように、docstring を持っている必要があります。len(items)
もう一度呼び出すので、一度呼び出して結果を保存することもできます。最後に、もしk > len(items)
?
def quick_select(items, k):
"""
Return the k-from-smallest item in items
Assumes 0 <= k < len(items)
"""
num_items = len(items)
if 0 <= k < num_items:
pivot = items[num_items // 2]
継続:
smallerlist = []
for i in lines:
if i<pivot:
smallerlist.append(i)
largerlist=[]
for i in lines:
if i>pivot:
largerlist.append(i)
lines
2 回繰り返しました。これを 1 つのパスに組み合わせることができます。また、より良い変数名:
smaller, larger = [], []
for item in items:
if item < pivot:
smaller.append(item)
elif item > pivot:
larger.append(item)
より良い変数名を継続し、
num_smaller = len(smaller)
num_pivot = num_items - num_smaller - len(larger)
次に、あなたif
のは故障しています。順番に読みやすいので、
if k < num_smaller:
return quick_select(smaller, k)
elif k < num_smaller + num_pivot
return pivot
else:
return quick_select(larger, k - num_smaller - num_pivot)
k < 0 または k >= num_items の場合はどうなるでしょうか?:
else:
raise ValueError("k={} is out of range".format(k))
最後に、この関数は末尾再帰であるため、代わりに反復関数に変換するのは簡単です。
while True:
pivot = items[num_items // 2]
# ...
if k < num_smaller:
items = smaller
num_items = num_smaller
elif k < num_smaller + num_pivot
return pivot
else:
items = larger
num_items = num_larger
k -= num_smaller + num_pivot
... 組み立てが必要です。お役に立てば幸いです。