用于max-sum-max多个列表的Pythonic方式

时间:2014-10-27 21:57:25

标签: 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]

总结每个" maxes"列表,所以:

for each i:
    sum_i = sum(ai_maxes)

取这3个总和中的最大值,所以:

max(sum_1, sum_2, sum_3)

我无法在这里使用map()。什么是最Pythonic(简洁)的方式来做到这一点?感谢。

2 个答案:

答案 0 :(得分:1)

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的{​​{1}}

为了使其更加明显,列表将分为以下几个:

x[i:i+5]

然后max得到最大的总和:

如果您想要每张支票中最高的两个元素:

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]]

如果答案应该是53:

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

答案 1 :(得分:0)

让我们把它分解成碎片。

第一点是你可能不想要单独的a1a2和a3`变量;如果您不得不重复对多个值执行完全相同的操作,然后迭代这些值,它们可能属于列表。所以:

a = [a1, a2, a3]

现在,如何将迭代器拆分为5个元素?有许多方法可以做到这一点,从the grouper function in the itertools recipes到压缩切片到迭代切片。我将使用grouper

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)

现在,鉴于每个列表推导仅用作一次性迭代,我们不妨将它们转换为生成器表达式。如果您愿意,可以将一些步骤合并在一起:

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)