Python—如何找到列表中第二个最低值的位置

Python—如何找到列表中第二个最低值的位置,python,list,Python,List,我有以下清单: list = [7,3,6,4,6] 我知道我可以使用list.indexminlist来查找列表中最低数字的位置,但是我如何使用它来查找第二个最低数字呢?您只需删除最小值,然后获取新列表中具有新最小值的最小值,这将是第二个最小值。我复制了一份列表,这样它就可以工作,但可能不需要这样做 lst_copy = list(lst) lst.remove(min(lst)) lst_copy.index(min(lst)) 你可以删除最小值,然后得到新列表的最小值,它有一个

我有以下清单:

list = [7,3,6,4,6]

我知道我可以使用list.indexminlist来查找列表中最低数字的位置,但是我如何使用它来查找第二个最低数字呢?

您只需删除最小值,然后获取新列表中具有新最小值的最小值,这将是第二个最小值。我复制了一份列表,这样它就可以工作,但可能不需要这样做

lst_copy = list(lst)
lst.remove(min(lst))
    lst_copy.index(min(lst))

你可以删除最小值,然后得到新列表的最小值,它有一个新的最小值,这将是第二个最小值。我复制了一个列表,这样它就可以工作了,但可能不需要这样做

lst_copy = list(lst)
lst.remove(min(lst))
    lst_copy.index(min(lst))
您可以根据值对枚举列表进行排序,然后选择第二项

def second_pos(numbers):
    return sorted(enumerate(numbers),key=lambda x:x[::-1])[1][0]

print(second_pos([7,3,6,4,6]))
结果:3,因为4是第二个最低值

此解决方案只涉及一次排序操作,之后不进行索引操作来查找索引,并保存最后一次操作

请注意,在情况2的值相等的情况下,有一个断开连接的程序选择位置最低的项目

还请注意,如果列表太小,您可以获得一个索引器,您可以根据值对枚举列表进行排序,然后选择第二项

def second_pos(numbers):
    return sorted(enumerate(numbers),key=lambda x:x[::-1])[1][0]

print(second_pos([7,3,6,4,6]))
结果:3,因为4是第二个最低值

此解决方案只涉及一次排序操作,之后不进行索引操作来查找索引,并保存最后一次操作

请注意,在情况2的值相等的情况下,有一个断开连接的程序选择位置最低的项目


还请注意,如果列表太小,您可以得到一个索引器

不要将列表用作变量名

编辑,最初被误读为第二高的指数,现在修正了,塔克斯·让·弗朗索瓦·法布

lst = [7,3,6,4,6]

lst.index(sorted(lst)[1])

Out[161]: 3

lst[3]
Out[162]: 4

sorted(lst)
Out[163]: [3, 4, 6, 6, 7]
上面的问题是输入列表中的重复数字,使用.index可以获得第一个匹配的索引

lst = [1, 1, 7,3,6,4,6]

lst.index(sorted(lst)[1])
Out[9]: 0                  # 0 is wrong, the postion of the 2nd smallest is 1  
我想这可以解决问题

n = 1
sorted([*enumerate(lst)], key=lambda x: x[1])[n][0]
Out[11]: 1  
看看这些碎片

[*enumerate(lst)]
Out[12]: [(0, 1), (1, 1), (2, 7), (3, 3), (4, 6), (5, 4), (6, 6)]
枚举将计数与输入lst中的值配对,*强制“解包”枚举对象,外部方括号在列表中“捕获”此输出

在Python内部,内置排序的第二个参数key=lambda x:x[1]告诉它查找来自[*enumeratelst]的元组的第二个位置,这些元组是来自lst的数字


使用[n][0]对该列表进行索引将获取第n个排序的元组,并从元组中获取第一个值,该元组是在enumerate中指定的索引。不要将列表用作变量名

编辑,最初被误读为第二高的指数,现在修正了,塔克斯·让·弗朗索瓦·法布

lst = [7,3,6,4,6]

lst.index(sorted(lst)[1])

Out[161]: 3

lst[3]
Out[162]: 4

sorted(lst)
Out[163]: [3, 4, 6, 6, 7]
上面的问题是输入列表中的重复数字,使用.index可以获得第一个匹配的索引

lst = [1, 1, 7,3,6,4,6]

lst.index(sorted(lst)[1])
Out[9]: 0                  # 0 is wrong, the postion of the 2nd smallest is 1  
我想这可以解决问题

n = 1
sorted([*enumerate(lst)], key=lambda x: x[1])[n][0]
Out[11]: 1  
看看这些碎片

[*enumerate(lst)]
Out[12]: [(0, 1), (1, 1), (2, 7), (3, 3), (4, 6), (5, 4), (6, 6)]
枚举将计数与输入lst中的值配对,*强制“解包”枚举对象,外部方括号在列表中“捕获”此输出

在Python内部,内置排序的第二个参数key=lambda x:x[1]告诉它查找来自[*enumeratelst]的元组的第二个位置,这些元组是来自lst的数字

使用[n][0]对该列表进行索引将获取第n个排序的元组,并从元组中获取第一个值,该元组是枚举中指定的索引。请尝试以下操作:

list.index(sorted(list)[1])
试试这个:

list.index(sorted(list)[1])
使用set来消除重复项,如下所示

lowest_nth = 2
lst.index(sorted(set(lst))[lowest_nth-1])
编辑重要备注:

如果您尝试使用此代码,如果不使用set,将看到重复值的错误结果:

lst = [7, 6, 6, 4, 3, 8]

def get_index_without_using_set():
    return lst.index(sorted(lst)[lowest_nth-1])

def get_index_using_set():
    return lst.index(sorted(set(lst))[lowest_nth-1])

print(lst)
print()
print('Without set:')
for lowest_nth in range(1,6):
    print('lowest {}: {}'.format(lowest_nth, get_index_without_using_set()))

print()
print('With set:')
for lowest_nth in range(1,6):
    print('lowest {}: {}'.format(lowest_nth, get_index_using_set()))


Output:

[7, 6, 6, 4, 3, 8]

Without set:
lowest 1: 4
lowest 2: 3
lowest 3: 1
lowest 4: 1  <-- wrong index, see below
lowest 5: 0

With set:
lowest 1: 4
lowest 2: 3
lowest 3: 1
lowest 4: 0
lowest 5: 5
使用set来消除重复项,如下所示

lowest_nth = 2
lst.index(sorted(set(lst))[lowest_nth-1])
编辑重要备注:

如果您尝试使用此代码,如果不使用set,将看到重复值的错误结果:

lst = [7, 6, 6, 4, 3, 8]

def get_index_without_using_set():
    return lst.index(sorted(lst)[lowest_nth-1])

def get_index_using_set():
    return lst.index(sorted(set(lst))[lowest_nth-1])

print(lst)
print()
print('Without set:')
for lowest_nth in range(1,6):
    print('lowest {}: {}'.format(lowest_nth, get_index_without_using_set()))

print()
print('With set:')
for lowest_nth in range(1,6):
    print('lowest {}: {}'.format(lowest_nth, get_index_using_set()))


Output:

[7, 6, 6, 4, 3, 8]

Without set:
lowest 1: 4
lowest 2: 3
lowest 3: 1
lowest 4: 1  <-- wrong index, see below
lowest 5: 0

With set:
lowest 1: 4
lowest 2: 3
lowest 3: 1
lowest 4: 0
lowest 5: 5

这似乎是恰当的:

def find_2nd_smallest(iterable):
    try:
        st = set(iterable)
        st.discard(min(st))
        return iterable.index(min(st))
    except:
        return None

my_list = [7,3,6,4,6]
print (find_2nd_smallest(my_list))
打印第二个最小值第一次出现的索引:

3
def find_nth_smallest(iterable,n):
    try:
        st = set(iterable)
        for i in range(n-1):
            st.discard(min(st))
        return iterable.index(min(st))
    except: return None

my_list = [7,3,6,4,6]
print (find_nth_smallest(my_list,2))
如果您想要一个可以输入最小数字的函数,则2表示第二个最小数字:

3
def find_nth_smallest(iterable,n):
    try:
        st = set(iterable)
        for i in range(n-1):
            st.discard(min(st))
        return iterable.index(min(st))
    except: return None

my_list = [7,3,6,4,6]
print (find_nth_smallest(my_list,2))

请注意,这些功能可能不是最有效的解决方案。

这似乎是合适的:

def find_2nd_smallest(iterable):
    try:
        st = set(iterable)
        st.discard(min(st))
        return iterable.index(min(st))
    except:
        return None

my_list = [7,3,6,4,6]
print (find_2nd_smallest(my_list))
打印第二个最小值第一次出现的索引:

3
def find_nth_smallest(iterable,n):
    try:
        st = set(iterable)
        for i in range(n-1):
            st.discard(min(st))
        return iterable.index(min(st))
    except: return None

my_list = [7,3,6,4,6]
print (find_nth_smallest(my_list,2))
如果您想要一个可以输入最小数字的函数,则2表示第二个最小数字:

3
def find_nth_smallest(iterable,n):
    try:
        st = set(iterable)
        for i in range(n-1):
            st.discard(min(st))
        return iterable.index(min(st))
    except: return None

my_list = [7,3,6,4,6]
print (find_nth_smallest(my_list,2))

请注意,这些函数可能不是最有效的解决方案。

这不符合书面要求-。删除将修改现有列表,并返回None。但是,基本的想法是正确的。listlist:这行不通:我只是在使用list函数,变量是list。为什么它不起作用呢?因为python不能将函数和变量这两件事与同一个名称相关联。这就是为什么人们不应该将事物命名为内置的。我知道它在OP中,但是你应该更改itok将其更改为LST,但它不能像写的那样工作-。remove修改列表,并且不返回任何值。但是,基本的想法是正确的。listlist:这行不通:我只是在使用list函数,变量是list。为什么它不起作用呢?因为python不能将函数和变量这两件事与同一个名称相关联。这就是为什么人们不应该将事物命名为内置的。我知道在手术室,但你应该

ld change itok把它改成了lst这比dupe的提议要复杂一点。例如,在这里使用heapq并不合适,因为您必须关联索引,而不仅仅是值。我甚至不明白,在类似alist=[7,3,6,4,6,3]的上下文中,第二个最低值意味着什么。预期的输出是第二个三还是第四个?它不是重复的。但是没有重新开放,因为它得到了足够的答案:@Piintesky不确定OP是否考虑过这一点,也不在乎。这比dupe的提议要复杂一点。例如,在这里使用heapq并不合适,因为您必须关联索引,而不仅仅是值。我甚至不明白,在类似alist=[7,3,6,4,6,3]的上下文中,第二个最低值意味着什么。预期的输出是第二个三还是第四个?它不是重复的。但是没有重新打开,因为它得到了足够的答案:@Piinthesky不确定OP是否考虑过这一点,或者给出了一个该死的答案。这返回了数字2-这意味着什么?答案不正确-2应该是1,以选择第二低,而不是最高。误读,是的,索引按1排序为第二低,fixed@f5r5e5d只是出于兴趣,如果我把其他数字放在最后的方括号里,他们会怎么做?例如,我如何找到第三个最低值?返回数字2-这是什么意思?答案不正确-2应为1以选择第二个最低值,而不是最高值。误读,是的,索引按1排序为第二个最低值,fixed@f5r5e5d只是出于兴趣,如果我把其他数字放在最后的方括号里,他们会怎么做?例如,我如何找到第三个最低值?但这不会破坏索引吗?setlst生成一个新对象,而不会触及原始lst。实际上,它会破坏该对象中的索引,但sorted会再次生成一个有序列表。我还不知道索引,只知道集合中最低的第n个值。然后lst.index方法给出该值所需的索引结果?最后没错。检查我的编辑@Jeanit,因为OP没有定义任何相等值的策略。你的答案很好。但这不会破坏索引吗?setlst生成一个新对象,不会触及原始lst。实际上,它会破坏该对象中的索引,但sorted会再次生成一个有序列表。我还不知道索引,只知道集合中最低的第n个值。然后lst.index方法给出该值所需的索引结果?最后没错。检查我的编辑@Jeanit,因为OP没有定义任何相等值的策略。你的答案很好。这部分的每一部分都是做什么的呢?对不起:按升序排序。所以你知道,在我们的情况下,你的第二个最低点将在第二个位置1。这就是我将sortedlist[1]设置为其值的原因。然后list.indexvalue将为您提供列表中某个元素的索引。对不起,我的回答太晚了!此解决方案会弄乱您试图检索的索引。如果您需要原始列表中完整的索引,请使用选定的答案。@dmoz真的吗?怎样sorted与sort不同。因为sorted创建了一个包含新索引的新列表,所以不是吗?如果这就是你要找的,很好,但是如果你需要原始索引,那么接受的答案可能会更好,对吗?这每个部分都有什么作用?对不起,按升序排序。所以你知道,在我们的情况下,你的第二个最低点将在第二个位置1。这就是我将sortedlist[1]设置为其值的原因。然后list.indexvalue将为您提供列表中某个元素的索引。对不起,我的回答太晚了!此解决方案会弄乱您试图检索的索引。如果您需要原始列表中完整的索引,请使用选定的答案。@dmoz真的吗?怎样sorted与sort不同。因为sorted创建了一个包含新索引的新列表,所以不是吗?如果这就是你想要的,很好,但是如果你需要原始索引,那么接受的答案可能会更好,对吗?