我有以下列表:
list = [7,3,6,4,6]
我知道我可以使用list.index(min(list))
查找列表中最小数字的位置,但如何使用它来查找 second 最低?
答案 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))
请注意,这些功能可能不是最有效的解决方案。