Максимальное значение в списке списков кортежа
у меня есть проблема, чтобы получить наибольшее значение в динамическом списке списков кортежей.
Список может выглядеть так:
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
Это немного более подробно, но может быть проще понять.