【问题标题】:Get max value from a list with lists?从带有列表的列表中获取最大值?
【发布时间】:2016-01-21 01:16:51
【问题描述】:

所以我有一个包含几个列表的列表,这些列表首先包含三个字符串,然后是一个浮点数,例如:

resultlist = [["1", "1", "a", 8.3931], ["1", "2", "b", 6.3231], ["2", "1", "c", 9.1931]]

如何创建一个返回最大值(此处为 9.1931)的函数?我试过了

def MaxValue():
    max_value = max(resultlist)
    return max_value

但这只是给了我一个清单。

编辑:另外,我可以通过什么方式获取值来自何处的索引?比如,来自哪个子列表?

【问题讨论】:

    标签: python list function python-2.7 max


    【解决方案1】:

    遍历您的外部列表并选择每个子列表的最后一个元素:

    def max_value(inputlist):
        return max([sublist[-1] for sublist in inputlist])
    
    print max_value(resultlist)
    # 9.1931
    

    最好将所有与函数相关的变量都保留在范围内(将列表作为参数传递,不要通过重用变量名来混淆命名空间)。

    【讨论】:

    • 你会得到最后一个元素,因为你知道列表是有序的,并且每个列表中最后一个元素总是较大的??
    • @EmiliOrtega 这个答案对这个问题非常具体---“我有一个包含几个列表的列表,这些列表首先都有三个字符串,然后是一个浮点数”---所以这个解决方案得到了最后一个元素,因为那是数字所在的位置。
    • 是的,我的意思是,如果你有一个 [["1", "1", "a", 10, 8.3931], ....] 这样的列表,它会仍然返回 8.3 而不是 10 对吗?
    • 正确。 sublist[-1] 返回每​​个子列表中的最后一个值。它与排序无关。
    【解决方案2】:

    也许比pythonic方式更实用:

    >>> max(map(lambda x: x[3], resultlist))
    9.1931
    

    它首先将结果列表的每个元素映射到数字值,然后找到最大值。

    中间数组是:

    >>> map(lambda x: x[3], resultlist)
    [8.3931000000000004, 6.3231000000000002, 9.1930999999999994]
    

    【讨论】:

      【解决方案3】:

      Numpy 有助于数字嵌套列表。试试这个:

      resultlist = [[3, 2, 4, 4], [1, 6, 7, -6], [5, 4, 3, 2]]
      max(resultlist)  # yields [5, 4, 3, 2] because 5 is the max in: 3, 1, 5
      np.max(resultlist)  # yields 7 because it's the absolute max
      

      max() 返回第一个元素是所有列表第一个元素的最大值的列表,而np.max() 返回所有嵌套列表中的最大值。

      【讨论】:

      • 这绝对应该是公认的答案——它提供了一个通用的解决方案,而不是公认的答案提供的超级特定于当前列表设置的解决方案。
      【解决方案4】:

      如果你也想要索引,你可以使用enumerateoperator.itemgetter 使用map

      from operator import itemgetter
      def max_val(l, i):
          return max(enumerate(map(itemgetter(i), l)),key=itemgetter(1)))
      

      这将返回一个带有索引的最大值的元组:

      In [7]: resultlist = [["1", "1", "a", 8.3931], ["1", "2", "b", 6.3231], ["2", "1", "c", 9.1931]]
      
      In [8]: max_val(resultlist, -1)
      Out[8]: (2, 9.1931)
      

      或者只是一个普通的 gen exp:

      from operator import itemgetter
      def max_val(l, i):
          return max(enumerate(sub[i] for sub in l), key=itemgetter(1))
      

      【讨论】:

      • +1 表示“itemgetter”。但是,我认为函数“max_val”的第一个定义有问题,至少我收到了 SyntaxError - 我猜括号有问题。
      • 你能删除它吗?我没有足够的声望来编辑它!? ;)
      • 好的,它会在某个时候出现。但是很好的解决方案!我现在也在下面的解决方案中加入了 itemgetter。
      【解决方案5】:
      resultlist = [["1", "1", "a", 8.3931], ["1", "2", "b", 6.3231], ["2", "1", "c", 9.1931]]
      print(max(map(lambda x: x[-1],resultlist)))
      

      输出:

      9.1931
      

      【讨论】:

        【解决方案6】:

        您是否想从浮点数(列表中的最后一个索引)中获取最大数量?如果是这样,这里有一个解决方案。

        last_indices = [x[3] for x in resultlist]
        return max(last_indices)
        

        【讨论】:

        • 为什么使用sorted()[0] 而不是max()?对列表进行排序以获得最大的价值是一个巨大的性能损失。
        • @wflynny 我编辑了我的答案,因为你实际上发表了你的评论,哈哈。
        【解决方案7】:

        这是一个答案,以防万一你得到一个数字并不总是在第三位的列表:

        from itertools import chain
        max(filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(resultlist)))
        

        发生了什么事? itertools.chain 展平列表列表,filter 然后选择所有数值,然后使用 max 函数确定最大值。 这里的优点是它也适用于任意列表列表,其中数值可以在列表中的任何位置找到。

        你的例子:

        resultlist = [['1', '1', 'a', 8.3931], ['1', '2', 'b', 6.3231], ['2', '1', 'c', 9.1931]]
        max(filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(resultlist))) 
        #prints 9.1931
        

        一个更一般的例子:

        myList = [[23, 34, 'a'],['b'],['t', 100]]
        max(filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(myList)))
        #prints 100
        

        编辑:

        如果您还想获取最大值的索引,您可以执行以下操作(使用@Padraic Cunningham 方法):

        from itertools import chain
        import operator
        resultlist = [['1', '1', 'a', 8.3931], ['1', '2', 'b', 6.3231], ['2', '1', 'c', 9.1931]]
        l = filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(resultlist))
        # l: [8.3931, 6.3231, 9.1931]
        max(enumerate(l), key = operator.itemgetter(1))
        #(2, 9.1931)
        

        这种方法假设每个列表只有一个数值!

        另一个使用列表的示例,其中数值位于任意位置:

        from itertools import chain
        import operator
        myList = [[23, '34', 'a'],['b', 1000],['t', 'xyz', 100]]
        l=filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(myList))
        max(enumerate(l), key = operator.itemgetter(1))
        #prints (1, 1000)
        

        【讨论】:

          【解决方案8】:

          正如其他人所提到的,您可以用更笼统的术语回答这个问题(即使没有额外的库)。

          maxval = max(map(max, resultlist))
          print(maxval)
          

          这会获取具有最大值的内部列表,然后将 max 函数映射到该内部列表上以找到最大值并将其存储在 maxval 中。

          【讨论】:

          • 如何摆脱警告“预期类型 Iterable,得到 _dict_values 而不是”?
          【解决方案9】:

          另一种获得答案的方法是使用列表推导:

          >>> max([x[3] for x in resultlist])
          9.1931
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-25
            • 2020-11-28
            • 2014-01-16
            • 2018-02-12
            • 2020-11-03
            • 1970-01-01
            • 1970-01-01
            • 2012-03-28
            相关资源
            最近更新 更多