如何获得子列表的最大值?

时间:2017-02-16 17:02:00

标签: python list

我试着在这里发现错误:

for list in result:
        print(sorted(list, key=operator.itemgetter(1), reverse=True)[0])

考虑到list = [['cat1',0.0],['cat2',0.487],['cat3',0.89] ...]

当我运行代码时出现此错误:

TypeError: 'float' object is not subscriptable

任何帮助?

4 个答案:

答案 0 :(得分:0)

在我看来,你试图对你的2d列表进行排序,而不是找到最大值。假设您可以使用lambda使用key关键字按每个子列表的第一个元素对您的2d列表进行排序:

>>> result = [['cat1', 0.0],['cat2', 0.487],['cat3', 0.89]]
>>> sorted(result, key=lambda sublist: sublist[1], reverse=True)[0]
['cat3', 0.89]
>>> 

答案 1 :(得分:0)

您可以将带有键功能的排序应用到外部列表中,但是您将其应用于每个内部列表:

itemgetter(1)

这会将itemgetter(1)(0.0)应用于列表中的每个元素,因此0.0[1]将失败并引发您看到的错误,因为它与print(sorted(result, key=operator.itemgetter(1), reverse=True)[0]) 相同。

键功能应用于列表元素,所述调用的结果用于与其他元素进行比较。但是,您可以这样做:

    String[] number;
    String userInput = "";
    String[] commands = { "random", "exit", "help"};
    double[] coord1 = new double[0];
    double[] coord2 = new double[0];
    Scanner scan = new Scanner(System.in);
    do {
        System.out.println("Enter Coordinates (ex 1,3)\n");
        userInput = scan.nextLine();

        if(!userInput.equals(commands[1]))
        {
            number = userInput.split(",");
            if(number.length != 2 || !number[0].matches("\\d+") || !number[1].matches("\\d+"))
            {
                System.out.println("Error: Invalid Input! Try again");
            }
            else
            {
                //our index to place our numbers will be the current length of our array
                int index = coord1.length;
                double[] temp = new double[coord1.length + 1];
                //copy the content to the same array but just 1 size bigger
                System.arraycopy(coord1, 0, temp, 0, coord1.length);
                coord1 = temp;
                temp = new double[coord2.length + 1];
                System.arraycopy(coord2, 0, temp, 0, coord2.length);
                coord2 = temp;
                //now use our index to place the numbers in the correct locations
                coord1[index] = Double.parseDouble(number[0]);
                coord2[index] = Double.parseDouble(number[1]);
            }
        }

    } while (!userInput.equals(commands[1]));

    for(int i = 0; i < coord1.length; i++)
    {
        System.out.println(i + " - X: " + coord1[i] + " Y: " + coord2[i]);
    }

答案 2 :(得分:0)

我想你想要

print(sorted(result, key=operator.itemgetter(1), reverse=True)[0])

即。没有循环。

答案 3 :(得分:0)

问题是,现在您正在对第二个列表进行排序,例如:['cat1', 0.0]。但是,您确实在尝试对result列表进行排序。所以你可以使用lambda表达式执行以下操作:

>>> sorted_list = sorted(result, key=lambda cat: cat[1], reverse=True)

>>> sorted_list
[['cat3', 0.89], ['cat2', 0.487], ['cat1', 0.0]]

请注意,此处cat是您的子列表,您要排序的键是您的子列表第二个值cat[1]