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

11

我有一个列表,其中有多个重复的最小元素,如下所示:

a = [1,2,1,1,4,5,6]

我希望Python能够返回列表中元素1及其所在的所有索引。我尝试使用过

,但需要更好的解决方案。

min_index, min_value = min(enumerate(a), key=operator.itemgetter(1))

该函数仅返回第一个出现1的索引位置。

3个回答

21

我会这样做:

minimum = min(a)
indices = [i for i, v in enumerate(a) if v == minimum]

16
确定最小元素,然后将其与列表中的其他元素进行比较。
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

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 循环中继续使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接