在Python中(可能包括numpy)有各种maximum
,max
和amax
函数,这些函数在某些程度上也包含在一些StackOverflow问题中,但它们似乎都没有解决了计算混合参数的最大值的相当明显的需求,即匹配以下要求:
我正在从pythonic的角度寻求一种多功能,紧凑且正确的解决方案。
NB。我试着自己编写代码,但收效甚微。我不会附加许多尝试,因为它们看起来很丑陋,也不起作用,而且最重要的是,我认为这对你们可能有所帮助的人来说会产生误导和浪费时间。这个问题已经太长了。
无论如何,这是我的一次尝试,但不起作用:
<!-- language: python -->
def flexMax1(aa):
'''
works on one argument, breaks it up into:
- empties: eliminated
- single numbers: replace with their max (or None)
- iterables (if any): deal with recursively, don't forget to add the prev calc max
'''
# progressively replaces iterables with their max (or None if no iterables)
M=None
while aa:
if M is not None:
aa=aa.append(M)
# eliminates empties and None, but preserves true zeros
aa= [a for a in aa if a or a==0]
try:
# max of non iterables
M=max( a for a in aa if not iterable(a) )
except ValueError: # it is an empty sequence
# there weren't bare numbers, only iterables, reduce them
aa=[ flexMax1(a) for a in aa if iterable(a) ]
else:
# do same, then will append the max of the iterables
aa=[ (flexMax1(a)) for a in aa if iterable(a) ]
return M
if __name__ == '__main__':
print(flexMax1([1]))
print(flexMax1([1,2]))
print(flexMax1([1,[2,3]]))
PS。我知道,从另一个角度来看,某些项目的最大值应该是其中一项,这可以通过使用max
的{{1}}可选参数来解决。我需要的只是返回总体最大数量
答案 0 :(得分:0)
您可以先将所有内容展平并计算出最大值:
import collections
def flatted(data):
if isinstance(data, collections.Iterable):
for element in data:
yield from flatted(data)
else:
yield data
def versatile_max(data, max_function=max):
max_function(flatted(data))