获取列表中所有最小元素及其索引

11 投票
3 回答
18789 浏览
提问于 2025-04-17 17:13

我有一个列表,这个列表里有一个最小的元素,这个元素出现了很多次,比如:

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

撰写回答