Получить список максимальных значений для кортежа из списка кортежей - PullRequest
1 голос
/ 15 февраля 2020

Я просто вхожу в Python и испытываю некоторые затруднения с пониманием потока управления и логики итерации c.

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

Я знаю, что мне не хватает помещения максимального элемента в новый список, но сначала я пытаюсь получить это максимальное значение.

def max_element_per_tuple(tuple_list):
    maximum = tuple_list[0]

    for item in tuple_list:
        if item > maximum:
            maximum = item

    return maximum

# test it
tuple_list = [(-1,0,1), (10,20,30), (100,50,25), (55,75,65)]
print(max_element_per_tuple(tuple_list))

Возвращает: (100, 50, 25)

Требуемое возвращение: (1, 30, 100, 75)

Или если список (?), То: [1, 30, 100, 75]

Ответы [ 5 ]

6 голосов
/ 15 февраля 2020

Просто попробуйте это однолинейное решение pythoni c

>>> tuple_list = [(-1,0,1), (10,20,30), (100,50,25), (55,75,65)]
>>> [max(e) for e in tuple_list]       # List
[1, 30, 100, 75]
>>> tuple(max(e) for e in tuple_list)  # Tuple
(1, 30, 100, 75)
2 голосов
/ 15 февраля 2020

Прямо сейчас вы просто просматриваете кортежи и возвращаете "самый большой" - сравнение кортежей выполняется поэлементно.

Вам нужно добавить еще один уровень l oop, который найдет максимум каждый кортеж:

def max_element_per_tuple(tuple_list):
    res = []

    for tup in tuple_list:      # loops over the tuples in the list
        maximum = tup[0]
        for item in tup:        # loops over each item of the tuple
            if item > maximum:
                maximum = item
        res.append(maximum)

    return res

Это дает ожидаемый результат:

>>> max_element_per_tuple([(-1, 0, 1), (10, 20, 30), (100, 50, 25), (55, 75, 65)])
[1, 30, 100, 75]
2 голосов
/ 15 февраля 2020

Ваша функция max_element_per_tuple верна (хотя и не нужна, поскольку существует стандартная функция max()). То, что вы сделали неправильно, вызвало эту функцию, используя список кортежей в качестве аргумента. Это нашло самый большой кортеж в списке («самый большой» для кортежей означает «тот, у которого первый элемент самый большой»), который оказался третьим - (100,50,25). Что вам нужно сделать, это либо:

result = list(map(max, tuple_list))

или

result = [max(t) for t in tuple_list]

Этот последний примерно эквивалентен:

result = []
for t in tuple_list:
    result.append(max(t))

Если вы замените max с вашим max_element_per_tuple результаты должны быть одинаковыми.

1 голос
/ 15 февраля 2020

Проблема: max_element_per_tuple (tuple_list) возвращает неверный результат, поскольку он ищет максимальный кортеж, а не максимальное значение в каждом кортеже.

def max_element_per_tuple(tuple_list):
    maximum = tuple_list[0]  # maximum is = (-1,0,1)

    for item in tuple_list:
        if item > maximum:  # compares the tuples e.g (-1,0,1) == (10,20,30)
            maximum = item

    return maximum  # at the end you have (100,50,25). it's the max tuple

Попробуйте любой из следующих параметров:

tuple_list = [(-1,0,1), (10,20,30), (100,50,25), (55,75,65)]

# Get the max from each tuple using List comprehension
max_items_list  = [max(tuple_item) for tuple_item in tuple_list]   # in a list
max_items_tuple = tuple(max(tuple_item) for tuple_item in tuple_list)   # in a tuple
print(max_items_list)
print(max_items_tuple)

# Get the max from each tuple using For Loop
# Can be used with List only, tuples are immutable

for_max_items_list = list()

for tuple_item in tuple_list:
  max_value = max(tuple_item)  # get the max of each tuple e.g Max((-1,0,1)) = 1
  for_max_items_list.append(max_value)  # add the max to list
print(for_max_items_list)
1 голос
/ 15 февраля 2020

Это должно работать

def max_element_per_tuple(tuple_list):
    maximum = []

    for item in tuple_list:
        maximum.append(max(item))


    return maximum

даст такой вывод: [1, 30, 100, 75]

...