在不使用内置函数的情况下返回第n个最低数字-Python

在不使用内置函数的情况下返回第n个最低数字-Python,python,list,Python,List,我正在进行以下工作: 编写一个函数,返回列表的第n个最小值(通常为iterable)。如果未指定第二个参数,则返回最小值 请注意,如果列表包含重复项,则应在确定第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: nu

我正在进行以下工作: 编写一个函数,返回列表的第n个最小值(通常为iterable)。如果未指定第二个参数,则返回最小值 请注意,如果列表包含重复项,则应在确定第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))

有什么想法吗?

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

b = [x for x in b]

谢谢,这就解决了。很明显我错过了,这很有道理。我会接受这个答案,当它允许我(5分钟左右)。谢谢请注意,
b[:]
list(b)
b.copy()
可能是更自然的浅层复制列表的方式,而不是使用列表理解。@Blckknght你是对的,而且在任何情况下它们都更有效。我知道这不是你真正想要的,但是,当第二个参数未通过时,实际上不需要使用
min
(或等效值)的特殊情况。只需使用
1
作为默认值
n
就可以了,剩下的代码就可以了。我很好奇,如果我使用1作为默认值,那会怎么样。如果列表本身没有1怎么办?如果列表的最小值是35或类似的值怎么办?我不是还需要算出列表中的最小值吗?但是
n
不应该是列表中的数字,它是你应该得到的最小值的序号,不是吗?您可能需要一个健全性检查,因为在一个只有10个值的列表中,试图找到
-2
的第二个最小数字或第3000个数字是没有意义的。但是,您可能希望通过排序和索引来检查正在解决的案例。没有必要把默认设置作为特例。我明白你现在所说的,是有道理的。谢谢
b = [x for x in b]