获取列表中所有最小元素及其索引
我有一个列表,这个列表里有一个最小的元素,这个元素出现了很多次,比如:
a = [1,2,1,1,4,5,6]
我想让Python返回这个元素1
,以及列表中所有1
出现的位置。我试过用
min_index, min_value = min(enumerate(a), key=operator.itemgetter(1))
但是这样只会给我1
第一次出现的那个位置。
3 个回答
1
这里的例子是通过列表循环了两次,第一次是找出最小值(min
),第二次是找出所有和这个最小值相等的元素。如果比较的过程很复杂,或者数据集非常大,你可能希望只循环一次。下面是一个如何做到的例子:
def locate_min(a):
enumerated_iter = enumerate(a)
index, min_value = next(enumerated_iter)
indexes = [index]
for index, value in enumerated_iter:
if value == min_value:
indexes.append(index)
elif value < min_value:
min_value = value
indexes = [index]
return min_value, indexes
enumerate
是一个迭代器。这意味着你可以使用 next
来“取出”序列中的第一个值,这样就可以开始搜索了。之后,你可以在 for
循环中继续处理。
20
我会这样做:
minimum = min(a)
indices = [i for i, v in enumerate(a) if v == minimum]
17
找出列表中最小的元素,然后把它和列表里的其他元素进行比较。
def locate_min(a):
smallest = min(a)
return smallest, [index for index, element in enumerate(a)
if smallest == element]
这段代码会返回一个元组(最小元素, [位置, 位置, ...])。如果我理解得没错,这就是你想要的结果。以你的例子为例:
>>> locate_min([1, 2, 1, 1, 4, 5, 6])
(1, [0, 2, 3])
这个例子使用了列表推导式。如果你不太了解这个概念,它大致相当于下面的for循环版本。(建议你使用第一种版本,这只是为了帮助你理解它是怎么工作的)
def locate_min(a):
min_indicies = []
smallest = min(a)
for index, element in enumerate(a):
if smallest == element: # check if this element is the minimum_value
min_indicies.append(index) # add the index to the list if it is
return smallest, min_indicies