Как я могу получить максимум по всем элементам в кортеже кортежей?Как получить максимальный элемент в кортеже кортежей?
Пример:
x = ((3, 4, 5), (4.5, 5.5, 6.5), (-1, 0, 1, 10))
# want 10
Как я могу получить максимум по всем элементам в кортеже кортежей?Как получить максимальный элемент в кортеже кортежей?
Пример:
x = ((3, 4, 5), (4.5, 5.5, 6.5), (-1, 0, 1, 10))
# want 10
Вы можете использовать вложенную for
цикл:
In [9]: max(n for s in x for n in s)
Out[9]: 10
И выравниваться произвольно вложенного списка, вы можете использовать рекурсивную функцию:
def flatten(lst):
for item in lst:
if isinstance(item, (tuple, list)):
for result in flatten(item):
yield result
else:
yield item
Использование itertools.chain
и max()
:
In [93]: from itertools import chain
In [94]: max(chain(*x))
Out[94]: 10
или с помощью chain.from_iterable
:
In [97]: max(chain.from_iterable(x))
Out[97]: 10
Создание плоского списка:
In [101]: list(chain.from_iterable(x))
Out[101]: [3, 4, 5, 4.5, 5.5, 6.5, -1, 0, 1, 10]
In [102]: list(chain(*x))
Out[102]: [3, 4, 5, 4.5, 5.5, 6.5, -1, 0, 1, 10]
Эти itertools
методы очень эффективны по сравнению с другими альтернативами.
Похожие: Flattening a shallow list in Python
еще один вариант, вдоль линий вложенная для цикла:
max(max(i) for i in x)
Если вы почему-импорт-когда-я-могу-делать-он сам своего рода парень, я предлагаю:
>>> x = ((3, 4, 5), (4.5, 5.5, 6.5), (-1, 0, 1, 10))
>>> max(max(t) for t in x)
10
Чтобы распрямить кортеж кортежей:
>>> tuple(elem for t in x for elem in t)
(3, 4, 5, 4.5, 5.5, 6.5, -1, 0, 1, 10)
или
>>> sum((t for t in x),())
(3, 4, 5, 4.5, 5.5, 6.5, -1, 0, 1, 10)
Документы Python показывают, что мы должны предпочесть 'itertools' для выравнивания, а не использовать' sum'. http://docs.python.org/2/library/functions.html#sum –
@AshwiniChaudhary Предложение создается, потому что 'itertools.chain' возвращает генератор вместо создания нового списка/кортежа. Если вы собираетесь сделать из него «список», обе альтернативы почти одинаковы. – juliomalegria
Нет, они не одинаковы, 'itertools.chain' и' chain.from_iterable' являются высокоэффективными по сравнению с выражением генератора и 'sum'. –
Вы можете преобразовать кортеж в единый кортеж со всеми элементами, а затем выполнить пошаговый (или использовать встроенный метод максимального()). Это также отвечает на вопрос о том, как «сгладить» кортеж.
a_tuple = ((1, 2, 3), (5, 6, 7), (8, 9))
tuple_to_string = str(a_tuple)
После преобразования его в строку, удалить «(», «)», а также любые пробелы «», а затем использовать присоединиться, чтобы преобразовать его в один список, а затем кортеж(), чтобы преобразовать его обратно в кортеж.
altered_string = tuple_to_string.replace("(", "").replace(")", "").replace(" ", "")
>> "1,2,3,5,6,7,8,9"
flattened_tuple = tuple(altered_string.split(","))
>> ('1', '2', '3', '5', '6', '7', '8', '9')
Все в одной строке, то:
flattened_tuple = tuple(str(a_tuple).replace("(", "").replace(")", "").replace(" ", "").split(","))
>> ('1', '2', '3', '5', '6', '7', '8', '9')
Чтобы найти наибольшее число, а затем использовать:
max(flattened_tuple)
>> 9
Примите к сведению, что делает его таким образом будет конвертировать любые элементы внутри кортеж к строке. Если вы хотите, чтобы они вышли одинаково, вам нужно будет продолжить форматирование. Однако для этой цели это работает отлично.
Как связанная информация, как я могу обычно сгладить список, так что 'flatten (x) = (3, 4, 5, 4.5, 5.5, 6.5, -1, 0, 1, 10)'? – Frank