列表:使用更好的切片来查找子集的迭代和
Lists: using better slicing to find iterative sums of subsets
假设我有一个列表,
A = range(1, 6) = [1, 2, 3, 4, 5]
B
,最终的结果,是一个列表的列表。给定 i
和 j
,您将如何制作一个迭代和列表,其中索引 i
限定一侧而 j
限定另一侧?
B[j] = sum(A[j:i+1] or A[i:j+1])
取决于 j
或 i
哪个更大。
索引 0 和 2 的示例:
B[0] = [1, 1+2, 1+2+3, 1+2+3+4, 1+2+3+4+5]
= [1, 3, 6, 10, 15]
B[2] = [1+2+3, 2+3, 3, 3+4, 3+4+5]
= [6, 5, 3, 7, 12]
======
当前代码(有效)是两个 for
循环,非常暴力。我认为应该有一种方法可以使用 reduce
?
A = range(1,6)
n = len(A)
B = []
for j in xrange(n):
b = []
for i in xrange(n):
if j <= i:
b.append(sum(A[j:i+1]))
else:
b.append(sum(A[i:j+1]))
B.append(b)
# print
for b in B:
print b
次要背景:可能是我对欧拉 82 项目的解决方案的一部分
你最终重新计算了很多次总和。而是创建它们一次并查找它们以查找 b
:
的每个元素
A = range(1,6)
n = len(A)
mapping = {}
for i in xrange(n):
for j in xrange(i,n):
mapping[i,j] = sum(A[i:j+1])
B = []
for j in xrange(n):
b = []
for i in xrange(n):
if j <= i:
b.append(mapping[j,i])
else:
b.append(mapping[i,j])
B.append(b)
如果您只是使映射适用于 [i,j]
或 [j,i]
:
,则可以消除检查 j<=i
的需要
mapping = {}
A = range(1,6)
n = len(A)
for i in xrange(n):
for j in xrange(i,n):
mapping[i,j] = sum(A[i:j+1])
mapping[j,i] = mapping[i,j] #for both ways
B = [[mapping[i,j] for i in xrange(n)] for j in xrange(n)]
虽然请注意,这意味着每个 B[x][y]
将直接坐标到 mapping[x,y]
,因此您可能只想单独使用映射。
假设我有一个列表,
A = range(1, 6) = [1, 2, 3, 4, 5]
B
,最终的结果,是一个列表的列表。给定 i
和 j
,您将如何制作一个迭代和列表,其中索引 i
限定一侧而 j
限定另一侧?
B[j] = sum(A[j:i+1] or A[i:j+1])
取决于 j
或 i
哪个更大。
索引 0 和 2 的示例:
B[0] = [1, 1+2, 1+2+3, 1+2+3+4, 1+2+3+4+5]
= [1, 3, 6, 10, 15]
B[2] = [1+2+3, 2+3, 3, 3+4, 3+4+5]
= [6, 5, 3, 7, 12]
======
当前代码(有效)是两个 for
循环,非常暴力。我认为应该有一种方法可以使用 reduce
?
A = range(1,6)
n = len(A)
B = []
for j in xrange(n):
b = []
for i in xrange(n):
if j <= i:
b.append(sum(A[j:i+1]))
else:
b.append(sum(A[i:j+1]))
B.append(b)
# print
for b in B:
print b
次要背景:可能是我对欧拉 82 项目的解决方案的一部分
你最终重新计算了很多次总和。而是创建它们一次并查找它们以查找 b
:
A = range(1,6)
n = len(A)
mapping = {}
for i in xrange(n):
for j in xrange(i,n):
mapping[i,j] = sum(A[i:j+1])
B = []
for j in xrange(n):
b = []
for i in xrange(n):
if j <= i:
b.append(mapping[j,i])
else:
b.append(mapping[i,j])
B.append(b)
如果您只是使映射适用于 [i,j]
或 [j,i]
:
j<=i
的需要
mapping = {}
A = range(1,6)
n = len(A)
for i in xrange(n):
for j in xrange(i,n):
mapping[i,j] = sum(A[i:j+1])
mapping[j,i] = mapping[i,j] #for both ways
B = [[mapping[i,j] for i in xrange(n)] for j in xrange(n)]
虽然请注意,这意味着每个 B[x][y]
将直接坐标到 mapping[x,y]
,因此您可能只想单独使用映射。