Максимальное значение в списке списков кортежа

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

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() но она не работает со строками и целыми числами. Ф.е. 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' unsubscriptable

но если я использую 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 ответов


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

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

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

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

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

коррекция

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

немного более pythonic, чем то, что у вас есть в настоящее время как

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)

Как говорит 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

Это немного более подробно, но может быть проще понять.