Python - 如何在列表中查找第二低值的位置

时间:2017-11-24 20:23:31

标签: python list

我有以下列表:

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

我知道我可以使用list.index(min(list))查找列表中最小数字的位置,但如何使用它来查找 second 最低?

6 个答案:

答案 0 :(得分:4)

不要将list用作var名称

编辑,最初被误读为第二高的指数 - 现在修复,比起Jean-FrançoisFabre

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)]

enumerate将计数与枚举对象的输入lst*强制'解包'中的值配对,外部sq括号'catch'在{{ 1}}

在Python内置list内第二个参数sorted告诉它查看来自key=lambda x: x[1]的元组的第二个位置[*enumerate(lst)]

lst

带有sorted([*enumerate(lst)], key=lambda x: x[1]) Out[13]: [(0, 1), (1, 1), (3, 3), (5, 4), (4, 6), (6, 6), (2, 7)] 的列表的索引获取第n个排序元组,并从元组中获取第一个值,该元组是[n][0]中签名的索引

答案 1 :(得分:1)

您可以根据值对enumerate d列表进行排序,然后选择第二项。

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是第二个最低值

此解决方案仅涉及一个sort操作,之后没有index操作来查找索引,从而保存了上一次O(n)操作。

请注意,在案例2值相等的情况下,有一个决胜局选择最低位置项目。

另请注意,如果列表太小,您可以获得IndexError

答案 2 :(得分:1)

试试这个:

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

答案 3 :(得分: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

答案 4 :(得分:0)

你可以删除min然后获得具有新min的新列表的min,这将是第二分钟。我制作了一份清单副本,因此可以使用,但可能不需要这样做。

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

答案 5 :(得分:0)

这似乎是合适的:

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

如果你想要一个可以输入最小数字的函数(2意味着第二小):

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))

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