最大和最大多个列表的Pythonic方法
我有3个清单:最大和最大多个列表的Pythonic方法,python,python-2.7,Python,Python 2.7,我有3个清单: a1 = range(10) a2 = range(10,20) a3 = range(20,30) 我需要做以下工作: 对于每个列表,获得每5个元素块的最大值,因此假设: a1_maxes = [max1_a1, max2_a1] a2_maxes = [max1_a2, max2_a2] a3_maxes = [max1_a3, max2_a3] 对每个“最大值”列表求和,以便: for each i: sum_i = sum(ai_maxes) 取这3个总和的
a1 = range(10)
a2 = range(10,20)
a3 = range(20,30)
我需要做以下工作:
对于每个列表,获得每5个元素块的最大值,因此假设:
a1_maxes = [max1_a1, max2_a1]
a2_maxes = [max1_a2, max2_a2]
a3_maxes = [max1_a3, max2_a3]
对每个“最大值”列表求和,以便:
for each i:
sum_i = sum(ai_maxes)
取这3个总和的最大值,因此:
max(sum_1, sum_2, sum_3)
我无法在这里使用map()
。最简洁的方法是什么?谢谢
a1 = range(10)
a2 = range(10,20)
a3 = range(20,30)
print(max(sum(x[i:i+5]) for x in (a1,a2,a3) for i in xrange(0,len(a1),5)))
135
只需获取每个块的sum
x[i:i+5]
为使其更为明显,列表分为以下几部分:
print(list(x[i:i+5]) for x in [a1,a2,a3] for i in xrange(0,len(a1),5))
[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24], [25, 26, 27, 28, 29]]
那么max只得到最大的总和:
如果要从每个检查中选择最高的两个元素:
mx_pair = max(sorted(x[i:i+5])[-2:] for x in (a1,a2,a3) for i in xrange(0,len(a1),5))
print(sum(mx_pair))
57
如果答案是53:
from itertools import izip,imap
def chunks(l):
for i in xrange(0,len(l), 5):
yield l[i:i+5]
sums = (max(izip(*ele)) for ele in imap(chunks,(a1,a2,a3)))
print(sum(max(sums)))
让我们把它分成几块 第一点是,您可能不需要单独的
a1
、a2
和a3`变量;如果您必须重复对多个值执行完全相同的操作,然后对这些值进行迭代,那么它们可能属于一个列表。因此:
a = [a1, a2, a3]
现在,如何将一个iterable拆分为5个元素?有很多方法可以做到这一点,从压缩切片到迭代切片。我将使用石斑鱼:
grouped = [grouper(sublist, 5) for sublist in a]
现在我们只需要每组的最大值,因此:
maxes = [[max(group) for group in sublist] for sublist in a]
现在,我们要总结每个子列表:
sums = [sum(sublist) for sublist in maxes]
最后,我们要取这些总和的最大值:
maxsum = max(sums)
现在,考虑到这些列表理解中的每一个都只是作为一次性的iterable使用,我们不妨将它们转换为生成器表达式。如果愿意,您可以将一些步骤合并在一起:
maxsum = max(sum(max(group) for group in grouper(sublist, 5)) for sublist in a)
这样做之后,实际上不需要显式创建a
,因为它只出现一次:
maxsum = max(sum(max(group) for group in grouper(sublist, 5))
for sublist in a1, a2, a3)
当你说“获取每5个元素块的最大值”时,你的意思是对于a1=[1 2 3 4 5 6]
,a1_maxes=[5 6]
?为什么不使用numpy.array
?两个问题:分组=[grouper(sublist,5)用于a中的子列表]
,[[max(group)用于子列表]用于分组中的子列表]
,总和=[sum](子列表)用于以最大值表示的子列表]
…我正在寻找一个Python 2.7解决方案。grouper
我相信是Python>=3。@SandeepY grouper配方也存在于Python 2.7中:@SandeepY:你为什么不看文档就认为2.7中不存在某些东西?或者不尝试它?特别是因为这是配方中的代码,所以它甚至不存在呃,如果配方在2.7文档中;如果你将3.x配方复制到Python 2.7解释器或脚本中,效果很好。我认为输出应该是53而不是135。@AshwiniChaudhary,你的意思是57吗?不,53,24+29来自a3。@AshwiniChaudhary,那么28和29呢?OP希望五个元素的每个卡盘都有两个最高值。a1_maxes=[max1_a1,max2_a1]
@DarrenRinger,我已经介绍了几乎所有的可能性