Python - выбрать подсписок с наибольшим целочисленным значением в указанной позиции? - PullRequest
1 голос
/ 29 ноября 2010

У меня есть вложенный список:

nested_list = [['a', 3], ['a', 1], ['a', 5]]

Как перебрать этот список, выбрать подсписок с максимальным целочисленным значением?

holder = []

for entry in nested_list:
    tmp = sublist with max entry[2] value
    holder.append(tmp)

Я застрял при кодированиивторая строка.

Любая помощь с благодарностью.

Ответы [ 3 ]

8 голосов
/ 29 ноября 2010

try:

max(nested_list, key=lambda x: x[1])

или

import operator

max(nested_list, key=operator.itemgetter(1))

Если первый элемент всегда будет 'a', вы можете просто сделать

max(nested_list)

Если выВы хотите погрузиться в некоторую проверку типов, и вы хотите сделать это для произвольных подсписков (только одного уровня. что-то вроде [12, 'a', 12, 42, 'b']), вы можете сделать что-то вроде.

import numbers

max(nested_list, key=lambda x: max(i for i in x 
                                   if isinstance(i, numbers.Integral)))

В любом случае, если вы не уверены, что элементы nested_list на самом деле являются списками, вы можете выполнить

import collections

max((s for s in nested_list 
     if isinstance(s, collections.Sequence)), 
    key=some_key_function)

и просто передать ему ключевую функцию:Ваше собственное изобретение или одно из других в этом ответе.

С точки зрения вопроса lambda x: x[1] против operator.itemgetter(1), я бы описал.В princible itemgetter должен быть верным путем, но я видел, как решения operator выигрывают от лямбда-функции, которая делает «ошибки» (я использую термин свободно, код все еще работает) в operator.Я бы предпочел itemgetter, если производительность не имеет значения (и, вероятно, если это имеет значение), но некоторые люди предпочитают избегать дополнительных import.

1 голос
/ 29 ноября 2010

Если список так прост, как вы предлагаете:

>>> nested_list = [['a', 3], ['a', 1], ['a', 5], ['a',2]]
>>> k = sorted(nested_list)
>>> k[-1]
['a', 5]
>>> 
1 голос
/ 29 ноября 2010

Делает ли это то, что вы хотите?

biggest = nested_list[0]

for entry in nested_list:
    if entry[1] > biggest[1]:
        biggest = entry
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...