2013-04-29 127 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 2013-04-29 00:07:39

回答

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.chainmax()

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

还有一个选项,沿着嵌套的for循环的线路:

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

如果你是一个为什么,进口时-I-可以-DO-IT-我还挺家伙,我建议:

>>> 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 – 2013-04-29 00:23:00

+0

@AshwiniChaudhary建议是因为'itertools.chain'返回一个生成器而不是创建一个新的列表/元组。如果你打算做一个'list',两种选择都差不多。 – juliomalegria 2013-04-29 00:32:14

+0

不,它们不一样,'itertools.chain'和'chain.from_iterable'与生成器表达式和'sum'相比非常高效。 – 2013-04-29 00:44:16

0

您可以在元组转换为与所有元素的一个元组,然后遍历那个(或使用内置的方法Max())。这也回答了你如何“扁平化”元组的问题。

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 

注意到,做这种方式将任何元素转换的内该元组为一个字符串。如果你想让它们出来,你必须进一步格式化。尽管如此,这个工作很好。