不使用内置函数就返回第n个最低数字-Python

时间:2019-01-16 22:32:20

标签: python list

我正在从事以下工作: 编写一个返回列表的第n个最低编号(或通常可迭代)的函数。如果未指定第二个参数,则返回最低的 请注意,如果列表中包含重复项,则应在确定第n个最低值之前对其进行处理

我的以下工作正常:

numbers = [8,9, 1,300,5, 54, 54]
def nth_lowest(b, n='N/A'):
    nums = set(b)
    if n == 'N/A':
        return min(b)
    else:
        nums = sorted(nums)
        return nums[n-1]

print(nth_lowest(numbers))
print(nth_lowest('ananasgnasgzynrmas', 6))
print(nth_lowest(numbers, 4))

但是我想尝试在不使用内置SET或MIN函数的情况下编写它。这是我所拥有的:

numbers = [8,9, 1,300,5, 54, 54]
def nth_lowest(b, n='N/A'):
    nums = []
    new_list = []
    for i in b:  # instead of using set()
        if i not in nums:
            nums.append(i)
    nums = sorted(nums)
    if n == 'N/A':
        while b: # instead of using min()
            minimum = b[0]
            for x in b:
                if x < minimum:
                    minimum = x
            new_list.append(minimum)
            b.remove(minimum)
        return new_list
    else:
        return nums[n-1]

print(nth_lowest(numbers))
print(nth_lowest('ananasgnasgzynrmas', 6))
print(nth_lowest(numbers, 4))

但以下内容有误:

return nums[n-1]
IndexError: list index out of range

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

问题在于您在算法b.remove(minimum)期间修改了输入列表。然后,当您第二次使用numbers时,它实际上是空的,nums也是如此。您可以在函数顶部添加以下内容以创建输入的副本:

b = [x for x in b]