2013-04-29 5 views
1

Как я могу получить максимум по всем элементам в кортеже кортежей?Как получить максимальный элемент в кортеже кортежей?

Пример:

x = ((3, 4, 5), (4.5, 5.5, 6.5), (-1, 0, 1, 10)) 
# want 10 
+0

Как связанная информация, как я могу обычно сгладить список, так что 'flatten (x) = (3, 4, 5, 4.5, 5.5, 6.5, -1, 0, 1, 10)'? – Frank

ответ

1

Вы можете использовать вложенную 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 
5

Использование 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

3

еще один вариант, вдоль линий вложенная для цикла:

max(max(i) for i in x) 
5

Если вы почему-импорт-когда-я-могу-делать-он сам своего рода парень, я предлагаю:

>>> 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) 
+1

Документы Python показывают, что мы должны предпочесть 'itertools' для выравнивания, а не использовать' sum'. http://docs.python.org/2/library/functions.html#sum –

+0

@AshwiniChaudhary Предложение создается, потому что 'itertools.chain' возвращает генератор вместо создания нового списка/кортежа. Если вы собираетесь сделать из него «список», обе альтернативы почти одинаковы. – juliomalegria

+0

Нет, они не одинаковы, 'itertools.chain' и' chain.from_iterable' являются высокоэффективными по сравнению с выражением генератора и 'sum'. –

0

Вы можете преобразовать кортеж в единый кортеж со всеми элементами, а затем выполнить пошаговый (или использовать встроенный метод максимального()). Это также отвечает на вопрос о том, как «сгладить» кортеж.

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 

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

Смежные вопросы