【问题标题】:Python - Finds the index of the smallest element in the list A from index k onwardsPython - 从索引 k 开始查找列表 A 中最小元素的索引
【发布时间】:2018-09-12 11:34:10
【问题描述】:

我一直在寻找如何考虑“k”来解决以下问题。基本上,它应该从索引 k 开始,并在从 k 到列表末尾的范围内查找最小值。

def find_min_index(A, k):
    """
    Finds the index of the smallest element in the list A from index k onwards

    Parameters:
        A (list)
        k: index from which start search

    Example use:
    >>> find_min_index([1, 2, 5, -1], 0)
    3
    >>> find_min_index([1, 1, 1, 5, 9], 2)
    2
    """

    minpos = A.index(min(A))
    return minpos

【问题讨论】:

  • 到目前为止你做了什么?你需要有 list[k:] 并在循环或类似的东西中找到最小的元素。
  • k + numpy.argmin(A[k:])
  • @Ekrem 只是最后两行,包括 minpos,而不是我尝试以某种方式包括 k 步骤但没有成功..
  • @dobera 在我发表评论后,已经发送了一些不错的答案。如我所见,您很难创建以第 k 个索引开头的子列表。

标签: python list indexing min


【解决方案1】:

单线解决方案是这样的:

return A[k:].index(min(A[k:]) + k

你从 A[k:] 中选择最小的元素,在 A[k:] 中找到它的索引并添加 k 来补偿搜索区域。

一个稍微整洁的解决方案是这样的:

slice = A[k:]
return slice.index(min(slice)) + k

【讨论】:

  • 你可能不应该切片两次。切片一次,存储在变量中并重复使用。
【解决方案2】:

在以k 作为起始索引对列表进行切片之前,您可以使用enumerate 来跟踪原始索引:

from operator import itemgetter
def find_min_index(A, k):
    return min(list(enumerate(A))[k:], key=itemgetter(1))[0]

这样:

print(find_min_index([1, 2, 5, -1], 0))
print(find_min_index([1, 1, 1, 5, 9], 2))

会输出:

3
2

【讨论】:

    【解决方案3】:

    您可以使用enumerate 查找 min 的索引:

    def find_min_index(A, k):
        """
        Finds the index of the smallest element in the list A from index k onwards
    
        Parameters:
            A (list)
            k: index from which start search
    
        Example use:
        >>> find_min_index([1, 2, 5, -1], 0)
        3
        >>> find_min_index([1, 1, 1, 5, 9], 2)
        2
        """
    
        o, _ = min(enumerate(A[k:]), key=lambda i: i[1])
        minpos = k + o
        return minpos
    
    
    print(find_min_index([1, 2, 3, 4], 1))
    print(find_min_index([4, 3, 2, 1], 1))
    

    输出

    1
    3
    

    【讨论】:

      【解决方案4】:

      您可以将k 添加到从切片输入列表计算的索引中:

      def find_min_index(A, k):
          sliced = A[k:]
          return k + sliced.index(min(sliced))
      
      find_min_index([1, 2, 5, -1], 2)    # 3
      find_min_index([1, 1, 1, 5, 9], 2)  # 2
      

      【讨论】: