Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
最大和最大多个列表的Pythonic方法_Python_Python 2.7 - Fatal编程技术网

最大和最大多个列表的Pythonic方法

最大和最大多个列表的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个总和的

我有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,我已经介绍了几乎所有的可能性