Максимальное значение в списке списков кортежей - PullRequest
7 голосов
/ 11 февраля 2011

У меня проблема с получением наибольшего значения в динамическом списке списков кортежей.Список может выглядеть следующим образом:

adymlist = [[('name1',1)],[('name2',2),('name3',1), ...('name10', 20)], ...,[('name m',int),..]]

Теперь я перебираю Список, чтобы получить максимальное значение (целое число):

total = {}
y=0 
while y < len(adymlist):
    if len(adymlist) == 1:
         #has the List only 1 Element -> save it in total 
         total[adymlist[y][0][0]] = adymlist[y][0][1]
         y += 1
    else:
         # here is the problem
         # iterate through each lists to get the highest Value
         # and you dont know how long this list can be
         # safe the highest Value in total f.e. total = {'name1':1,'name10':20, ..}

Я много пытался получить максимальное значение, ноЯ не нашел никакого решения по моей проблеме.Я знаю, что должен пройтись по каждому кортежу в списке и сравнить его со следующим, но он не знает, как правильно его кодировать.

Также я могу использовать функцию max(), но она не работает со строками ицелые числа.fe a = [ ('a',5),('z',1)] -> результат - max(a) ---> ('z',1) obv 5> 1, но z> a, поэтому я попытался расширить функцию max с помощью max(a, key=int), но я получил ошибку типа.

Надеюсь, вы понимаете, что яхочу; -)

ОБНОВЛЕНИЕ Спасибо пока.

Если я использую itertools.chain(*adymlist) и max(flatlist, key=lambda x: x[1]) Я получу исключение, например: max_word = max (flatlist, key = lambda x: x [1]) TypeError: объект 'int' является неподписанным

НО Если я использую itertools.chain(adymlist), он работает нормально.Но я не знаю, как суммировать все целые числа из каждого кортежа списка.Мне нужна ваша помощь, чтобы понять это.

В противном случае я написал обходной путь для itertools.chain(*adymlist), чтобы получить сумму всех целых чисел и наибольшее целое число в этом списке.

chain = itertools.chain(*adymlist)
flatlist = list(chain)
# flatlist = string, integer, string, integer, ...
max_count = max(flatlist[1:len(flatlist):2])
total_count = sum(flatlist[1:len(flatlist):2])
# index of highest integer
idx = flatlist.index(next((n for n in flatlist if n == max_count)))
max_keyword = flatlist[idx-1]

Это все еще делает то, что я хочу, но разве это не грязно?

Ответы [ 2 ]

16 голосов
/ 11 февраля 2011

Чтобы уточнить, похоже, у вас есть список списков кортежей.Не похоже, что мы заботимся о том, в каком списке они находятся, поэтому мы можем упростить это до двух шагов

  • Свести список списков в список кортежей
  • Найтимаксимальное значение

Первая часть может быть выполнена с помощью itertools.chain (см., например, Сведение мелкого списка в Python )

Вторая часть может быть решена с помощьюМакс, у вас правильная идея, но вы должны передавать функцию, а не тот тип, который вам нужен.Эта функция должна возвращать значение, которое вы набрали, в этом случае вторая часть кортежа

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

Исправление

Я перечитал вашвопрос - вы ищете максимальное значение в каждом подсписке?Если это так, то применима только вторая часть.Просто переберите свой список для каждого списка

Немного более питонно, чем то, что вы хотели бы

output = [] 
for lst in lists:
   output.append( max(flatlist, key=lambda x: x[1]) )

или

map(lambda x:  max(x, key=lambda y: y[1]) , lists)
4 голосов
/ 11 февраля 2011

Как говорит spintheblack, у вас есть список списков кортежей. Я полагаю, вы ищете наибольшее целочисленное значение из всех кортежей.

Вы можете выполнять итерации по внешнему списку, а затем по списку кортежей кортежей, как это:

max_so_far = 0
for list in adymlist:
  for t in list:
    if t[1] > max_so_far:
      max_so_far = t[1]
print max_so_far

Это немного более многословно, но может быть легче понять.

...