您误报了错误;它不抱怨k
,它抱怨是smallerList
因为你定义了smallerlist
(小写-l),然后尝试用大写-L 来调用它。Python 变量区分大小写,即smallerlist is smallerList == False
.
查看您的代码:
def quickSelect(lines, k):
if len(lines) != 0:
len(lst) != 0
是非惯用语;PEP-8 说它应该只是lst
,如if lst:
. 此外,camelCase 是非 Pythonic 的;你的函数名应该是quick_select
. lines
意味着您只能对文本进行操作,但您的函数应该同样适用于任何可排序的数据类型,因此items
会更准确。您应该有一个文档字符串,以便下一个来的人知道它的作用,我们将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
两次;你可以把它组合成一个单程。此外,更好的变量名称:
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
的 s 出了问题;它们更容易按顺序阅读,所以
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
...需要一些组装,希望对您有所帮助!