【问题标题】:How to find the 1st, 2nd, 3rd highest values in a list in Python如何在 Python 的列表中查找第 1、第 2、第 3 个最高值
【发布时间】:2015-11-24 15:22:12
【问题描述】:

我知道如何找到第一个最高值,但不知道其余的。请记住,我需要打印第 1 次第 2 次和第 3 次最高值的位置。谢谢并尽量保持简单,因为我只编写了 2 个月的代码。他们也可以是联合行列

def linearSearch(Fscore_list):
    pos_list = []
    target = (max(Fscore_list))
    for i in range(len(Fscore_list)):
        if Fscore_list[i] >= target:
            pos_list.append(i)


        return pos_list

【问题讨论】:

  • 那些值可以重复出现在你的列表中?

标签: python arrays list


【解决方案1】:

这将创建 3 个最大项目的列表,以及相应索引的列表:

lst = [9,7,43,2,4,7,8,5,4]
values = []
values = zip(*sorted( [(x,i) for (i,x) in enumerate(f_test)], 
             reverse=True )[:3] )[0] 
posns = []
posns = zip(*sorted( [(x,i) for (i,x) in enumerate(f_test)], 
            reverse=True )[:3] )[1] 

如果同一个值可以出现多次(这将显示一个值的最高位置),事情就有点复杂了:

lst = [9,7,43,2,4,7,8,5,4]
ranks = sorted( [(x,i) for (i,x) in enumerate(lst)], reverse=True 
)
values = []

for x,i in ranks:
    if x not in values:
        values.append( x )
        posns.append( i )
        if len(values) == 3:
            break
print zip( values, posns )

【讨论】:

    【解决方案2】:

    使用heapq.nlargest:

    >>> import heapq
    >>> [i
    ...     for x, i
    ...     in heapq.nlargest(
    ...         3,
    ...         ((x, i) for i, x in enumerate((0,5,8,7,2,4,3,9,1))))]
    [7, 2, 3]
    

    【讨论】:

    • 要求的值部分的位置?
    • 并处理相同值的倍数?这很棘手,因为 OP 无法表达该要求:)
    【解决方案3】:

    将列表中的所有值添加到集合中。这将确保每个值只有一次。

    对集合进行排序。

    在原始列表中找到集合中前三个值的索引。

    有意义吗?

    编辑

    thelist = [1, 45, 88, 1, 45, 88, 5, 2, 103, 103, 7, 8]
    theset = frozenset(thelist)
    theset = sorted(theset, reverse=True)
    
    print('1st = ' + str(theset[0]) + ' at ' + str(thelist.index(theset[0])))
    print('2nd = ' + str(theset[1]) + ' at ' + str(thelist.index(theset[1])))
    print('3rd = ' + str(theset[2]) + ' at ' + str(thelist.index(theset[2])))
    

    编辑

    您还没有告诉我们如何处理“联合获胜者”,但看看您对其他答案的回答,我猜这可能是您正在尝试做的事情,也许吧?如果这不是您想要的输出,请给我们一个您希望获得的输出示例。

    thelist = [1, 45, 88, 1, 45, 88, 5, 2, 103, 103, 7, 8]
    theset = frozenset(thelist)
    theset = sorted(theset, reverse=True)
    thedict = {}
    for j in range(3):
        positions = [i for i, x in enumerate(thelist) if x == theset[j]]
        thedict[theset[j]] = positions
    
    print('1st = ' + str(theset[0]) + ' at ' + str(thedict.get(theset[0])))
    print('2nd = ' + str(theset[1]) + ' at ' + str(thedict.get(theset[1])))
    print('3rd = ' + str(theset[2]) + ' at ' + str(thedict.get(theset[2])))
    

    输出

    1st = 103 at [8, 9]
    2nd = 88 at [2, 5]
    3rd = 45 at [1, 4]
    

    顺便说一句:如果所有值都相同(首先相等)或由于其他原因没有第三个位置怎么办? (或第二名?)。你需要防范吗?如果你这样做了,那么我相信你可以设计出适当的安全防护来添加到代码中。

    【讨论】:

    • 是的,但我该怎么做,而且还可以有联合行列
    • 我添加了一些代码,让您了解如何执行我所说的操作。我不明白“加上也可以有联合行列”是什么意思。你能进一步解释一下吗?
    • 第二名的获奖者可能不止一个
    • 你必须学会​​在你的沟通中更加清晰。使用示例来说明问题通常是最容易的。你的意思是,使用“thelist”中的值,结果应该是1st = 103 at 8, 2nd = 103 at 9, 3rd = 88 at 2 还是你的意思是别的?您必须以一种不在您脑海中的人知道您脑海中的东西的方式将它从您的脑海中取出并放到页面上。编程中最难做的事情之一,但你必须掌握它。
    【解决方案4】:

    Jupyter image of the code working 这个问题太早出现在我的 Udemy 机器学习课程上。 Scott Hunter 在这个问题上对我帮助最大,但没有让我在网站上通过。必须自己深入思考这个问题。这是我的解决方案,因为在网上其他任何地方都找不到它——就我了解正在发生的一切而言*:

    lst = [9,7,43,2,4,7,8,9,4]
    ranks = sorted( [(x,i) for (i,x) in enumerate(lst)], reverse=True )
    box = []
    for x,i in ranks:
        if i&x not in box:
            box.append( x )
            if len(box) == 3:
                break
    print(box)
    

    所以我们有一个数字列表。为了对数字进行排名,我们在枚举/迭代列表时对具有值的每个位置的值及其位置进行排序。然后我们通过反转它把最高值放在最上面。现在我们需要一个盒子来放入我们的信息以便稍后取出,所以我们构建了那个盒子[]。现在,对于每个具有位置的值,将其放入框中,如果值和位置尚未在框中 - 意思是如果值已经在框中,但位置不在,仍然放入框中。我们只想要三个答案。最后告诉我变量 box 里有什么。 *本文中的许多答案很可能会奏效。

    【讨论】:

      【解决方案5】:

      有一个复杂的 O(n) 算法,但是最简单的方法是排序,也就是 O(n * log n),然后取顶部。这里最棘手的部分是在保留索引信息的同时对数据进行排序。

      from operator import itemgetter
      
      def find_top_n_indices(data, top=3):
          indexed = enumerate(data)  # create pairs [(0, v1), (1, v2)...]
          sorted_data = sorted(indexed, 
                               key=itemgetter(1),   # sort pairs by value 
                               reversed=True)       # in reversed order
          return [d[0] for d in sorted_data[:top]]  # take first N indices
      
      data = [5, 3, 6, 3, 7, 8, 2, 7, 9, 1]
      print find_top_n_indices(data)  # should be [8, 5, 4]
      

      同样可以使用heapq.nlargest() 完成,但仍需要将初始数据打包成元组,然后再解包。

      【讨论】:

        【解决方案6】:

        要过滤列表并按降序返回并删除重复项,请尝试使用此功能。 您可以传入您希望它返回多少个降序值作为关键字参数。

        另外注意,如果关键字参数(ordered_nums_to_return)大于列表的长度,它将按降序返回整个列表。如果需要它来引发异常,可以向函数添加检查。如果没有传递参数,它将返回最大值,如果需要,您可以再次更改此行为。

        list_of_nums = [2, 4, 23, 7, 4, 1]
        
        
        def find_highest_values(list_to_search, ordered_nums_to_return=None):
            if ordered_nums_to_return:
                return sorted(set(list_to_search), reverse=True)[0:ordered_nums_to_return]
            return [sorted(list_to_search, reverse=True)[0]]
        
        print find_highest_values(list_of_nums, ordered_nums_to_return=4)
        

        【讨论】:

          【解决方案7】:

          如果值可以重复出现在您的列表中,您可以尝试此解决方案。

          def search(Fscore_list, num=3):
              l = Fscore_list
              res = dict([(v, []) for v in sorted(set(l), reverse=True)[:num]])
              for index, val in enumerate(l):
                  if val in res:
                      res[val].append(index)
              return sorted(res.items(), key=lambda x: x[0], reverse=True)
          

          首先它找到num=3 的最高值并创建dictlist 为它的索引。接下来,它遍历列表,并为每个最高值 (val in res) 保存它的索引。然后只返回像[(highest_1, [indexes ...]), ..] 这样的元组排序列表。例如

          >>> l = [9, 7, 43, 2, 4, 7, 43, 8, 5, 8, 4]
          >>> print(search(l))
          [(43, [2, 6]), (9, [0]), (8, [7, 9])]
          

          要打印位置,请执行以下操作:

          >>> Fscore_list = [9, 7, 43, 2, 4, 7, 43, 8, 5, 8, 4, 43, 43, 43]
          >>> result = search(Fscore_list)
          >>> print("1st. %d on positions %s" % (result[0][0], result[0][1]))
          1st. 43 on positions [2, 6, 11, 12, 13]
          >>> print("2nd. %d on positions %s" % (result[1][0], result[1][1]))
          2nd. 9 on positions [0]
          >>> print("3rd. %d on positions %s" % (result[2][0], result[2][1]))
          3rd. 8 on positions [7, 9]
          

          【讨论】:

          • 你能用我的变量名输入吗
          • 这就够了吗?我在我的代码中没有看到你的任何其他变量。
          • 数字 3 来自哪里以及如何打印第 1、第 2 和第 3 的位置,包括联合行列
          • num=3 是函数的参数,默认值为 3,因为您正在寻找第一个、第二个和第三个。如果您也在寻找第 4 个,您可以使用 num=4 调用该函数,例如search(Fscore_list, num=4).
          • 我编辑了我的答案,向您展示如何打印职位。并从res = dict([(v, []) for v in sorted(set(l), reverse=True)[:num]]) 行中删除num + 1
          【解决方案8】:
          Input : [4, 5, 1, 2, 9] 
                  N = 2
          Output :  [9, 5]
          
          Input : [81, 52, 45, 10, 3, 2, 96] 
                  N = 3
          Output : [81, 96, 52]
          
          # Python program to find N largest 
          # element from given list of integers 
            
          l = [1000,298,3579,100,200,-45,900] 
          n = 4
            
          l.sort() 
          print(l[-n:]) 
          

          输出:

          [298, 900, 1000, 3579]
          

          【讨论】:

          • lst = [9,7,43,2,4,7,8,9,4] temp = [] count = 0 while count pre: pre = x temp.append(pre) print(temp) print(temp[2])
          【解决方案9】:
          lst = [9,7,43,2,4,7,8,9,4]
          
          temp1 = lst 
          print(temp1)
              
          #First Highest value: 
          print(max(temp1))
          temp1.remove(max(temp1))
          
          #output: 43
          
          # Second Highest value:
          print(max(temp1))
          temp1.remove(max(temp1))
          
          #output: 9
              
                  
          # Third Highest Value:
          print(max(temp1))
          
          #output: 7
          

          【讨论】:

          • 答案修改:第 1、2、3 个位置值打印为最高值。
          【解决方案10】:

          一行:

          lst = [9,7,43,2,8,4]
          
          index = [i[1] for i in sorted([(x,i) for (i,x) in enumerate(lst)])[-3:]]
          print(index)
          [2, 0, 1] 
          

          【讨论】:

            【解决方案11】:

            None 始终被认为小于任何数字。

            >>> None<4
            True
            >>> None>4
            False
            

            查找最高元素及其索引。 将其替换为None。找到新的最高元素及其索引。这将是原始列表中的第二高。将其替换为None。找到新的最高元素,实际上是第三个。

            可选:将找到的元素恢复到列表中。

            这是 O(最高元素数 * 列表大小),因此如果您的“三”增长,它的扩展性很差,但现在它是 O(3n)。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2017-01-19
              • 2022-01-20
              • 1970-01-01
              • 2019-09-12
              • 2015-11-04
              • 1970-01-01
              • 2018-11-02
              • 2022-11-13
              相关资源
              最近更新 更多