【问题标题】:Index of element in list列表中元素的索引
【发布时间】:2020-08-25 02:56:48
【问题描述】:

我想知道列表中的最大值是否比列表中的最小值小。如果有两个或多个具有最小值的索引,我想查看最大的索引。如果有两个或多个具有最大值的索引,我想查看最小的索引。现在我的代码如下所示:

maximum = max(lijst)
minimum = minimum(lijst)

if lijst.index(maximum) <= lijst.index(minimum):
...

但这并没有为我提供这些列表所需的索引:

[2, 9, 15, 36, 36, 3, 2, 36]

现在我想查看最小值的最大索引(在本例中为 6)和最大值的最小索引(在本例中为 3)。有人知道如何找到这些索引吗?

【问题讨论】:

  • 为了清楚起见,您要检查第一个最大值是否在最后一个最小值之前?
  • @MoonCheesez 我想检查在最小值出现之前是否出现最大值,所以如果存在 $x$ 和 $x=max$ 和 $y$ $y=min$ 和 $index.x >= index.y$.
  • 多个最小和最大索引的预期行为是什么?以您的示例为例,程序生成的期望值和实际值是多少?

标签: python list indexing max min


【解决方案1】:

您可以使用min/max 返回列表中的最小值/最大值,然后使用enumerate 获取索引,然后应用另一个索引列表的min/max,例如:

my_list = [2, 9, 15, 36, 36, 3, 2, 36]    
maxval = max(my_list)

indices = [index for index, val in enumerate(my_list) if val == maxval]
[3, 4, 7]
maxIndex = max(indices)
7

因此,如果您想检查最大值是否在最小值之前,则返回每个值的索引并比较两者。

【讨论】:

  • 我喜欢你对列表理解的使用。
  • 我发现它在很多情况下都非常有用。
【解决方案2】:

你需要使用 Python 的 find 函数。您可以通过继续检查直到 find 返回 -1 来找到最后一个最小值。

maximum = max(li)
minimum = minimum(li)

i1 = li.find(maximum)
i2 = li.find(minimum)
found = False
while(not found):
    if li.find(minimum, i2+1) != -1:
        i2 = li.find(minimum, i2+1)
    else:
        found = True

if i1 < i2:
.......

【讨论】:

    【解决方案3】:

    获取第一个最大值的索引:

    l.index(max(l))
    

    要获得最后一个最小值的索引,您可以反转列表并应用类似的东西:

    l.reverse()
    len(l)-l.index(min(l))-1
    

    【讨论】:

      【解决方案4】:

      你可能想到的

      虽然还有其他答案,但我想按照您的代码行做一些事情。它可能不是最有效的,但我相信这是您的想法:

      my_list = [2, 9, 15, 36, 36, 3, 2, 36]
      maximum = max(my_list)
      minimum = min(my_list)
      
      first_maximum_index = my_list.index(maximum)
      last_minimum_index = len(my_list)-1 - my_list[::-1].index(minimum)
      
      if first_maximum_index <= last_minimum_index:
          print("Yes!")
      

      .index() 获取列表中第一个值的索引。因此,要获得最后一个最小值,您需要在使用 .index() 之前反转列表,也就是这部分:

      my_list[::-1].index(minimum)
      

      之后,您将获得最小值的索引,但它是反向列表的索引。现在,你必须通过减去索引的数量来“反转”这个索引,len(my_list)-1 这给了你最终的表达式:

      len(my_list)-1 - my_list[::-1].index(minimum)
      

      之后,您可以像以前一样比较索引。

      更有效的方法

      现在,这里有一个更有效的解决方案(虽然更长,而且可能不太可读)。如果您注意到,您在上面的代码中运行了大约 4 次(最坏情况)列表。您可以将其简化为在列表中运行一次:

      my_list = [2, 9, 15, 36, 36, 3, 36]
      
      # Step 1
      current_min = float("inf")
      current_max = float("-inf")
      is_before = False
      
      for val in my_list:
          if val > current_max:
              is_before = False
              current_max = val
      
          if val <= current_min:
              current_min = val
              is_before = True
      
      
      if is_before:
          print("Yes!")
      

      这里的诀窍是考虑列表的子集:

      [2] # ???
      [2, 9] # False
      [2, 9, 15] # False
      [2, 9, 15, 36] # False
      [2, 9, 15, 36, 36] # False
      [2, 9, 15, 36, 36, 3] # False
      [2, 9, 15, 36, 36, 3, 2] # True
      [2, 9, 15, 36, 36, 3, 2, 36] # True
      

      如果您仔细观察,当出现新的最大值时,结果会从True 变为False。同样,当在列表末尾引入新的或现有的最小值时,结果会从 False 更改为 True

      这些对应于代码块:

          # If value introduced is the new maximum
          if val > current_max:
              is_before = False
              current_max = val
      
          # If value introduced is an existing or new minimum
          if val <= current_min:
              current_min = val
              is_before = True
      

      【讨论】:

        猜你喜欢
        • 2013-12-03
        • 2021-11-25
        • 2016-05-26
        • 2013-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-06
        相关资源
        最近更新 更多