我有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(简洁)的方式来做到这一点?感谢。
答案 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)
让我们把它分解成碎片。
第一点是你可能不想要单独的a1
,a2
和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)