如何对集合的可变大小部分求和?
How to sum variable-size parts of a collection?
我想计算一个集合的总和,对于不同大小的部分:
d = (1, 2, 3, 4, 5, 6, 7, 8, 9)
sz = (2, 3, 4)
# here I expect 1+2=3, 3+4+5=12, 6+7+8+9=30
itd = iter(d)
result = tuple( sum(tuple(next(itd) for i in range(s))) for s in sz )
print("result = {}".format(result))
我想知道我想出的解决方案是否是实现我想要的最'pythonic'(优雅、可读、简洁)的方式...
特别是,我想知道是否有办法摆脱单独的迭代器 'itd',使用切片是否会更容易?
没有理由摆脱你的迭代器——毕竟迭代 d
就是你正在做的。
不过,您的代码中的元组似乎确实过多。完成所有工作的那一行可以通过去掉它们变得更清晰:
it = iter(d)
result = [sum(next(it) for _ in range(s)) for s in sz]
# [3, 12, 30]
… 这具有额外的优势,即现在您生成的是列表而不是元组。 d
和 sz
也将 more sense 作为列表,顺便说一句:它们是同质数据的可变长度序列,而不是异构数据的固定长度序列。
另请注意,it
是任意迭代器的约定名称,_
是任何必须存在但从未实际使用的变量的约定名称。
更进一步,next(it) for _ in range(s)
所做的工作与 islice()
可以更清楚地完成的工作相同:
from itertools import islice
it = iter(d)
result = [sum(islice(it, s)) for s in sz]
# [3, 12, 30]
…在这一点上,我会说代码尽可能优雅、可读和简洁。
我会使用 itertools.islice,因为您可以直接使用 sz
中的值作为每个点的步长:
>>> from itertools import islice
>>> it=iter(d)
>>> [sum(islice(it,s)) for s in sz]
[3, 12, 30]
然后您可以根据需要将其转换为元组。
当然需要 iter
以便在最后一个切片停止的地方单步执行元组。否则每个切片将是 d[0:s]
我想计算一个集合的总和,对于不同大小的部分:
d = (1, 2, 3, 4, 5, 6, 7, 8, 9)
sz = (2, 3, 4)
# here I expect 1+2=3, 3+4+5=12, 6+7+8+9=30
itd = iter(d)
result = tuple( sum(tuple(next(itd) for i in range(s))) for s in sz )
print("result = {}".format(result))
我想知道我想出的解决方案是否是实现我想要的最'pythonic'(优雅、可读、简洁)的方式...
特别是,我想知道是否有办法摆脱单独的迭代器 'itd',使用切片是否会更容易?
没有理由摆脱你的迭代器——毕竟迭代 d
就是你正在做的。
不过,您的代码中的元组似乎确实过多。完成所有工作的那一行可以通过去掉它们变得更清晰:
it = iter(d)
result = [sum(next(it) for _ in range(s)) for s in sz]
# [3, 12, 30]
… 这具有额外的优势,即现在您生成的是列表而不是元组。 d
和 sz
也将 more sense 作为列表,顺便说一句:它们是同质数据的可变长度序列,而不是异构数据的固定长度序列。
另请注意,it
是任意迭代器的约定名称,_
是任何必须存在但从未实际使用的变量的约定名称。
更进一步,next(it) for _ in range(s)
所做的工作与 islice()
可以更清楚地完成的工作相同:
from itertools import islice
it = iter(d)
result = [sum(islice(it, s)) for s in sz]
# [3, 12, 30]
…在这一点上,我会说代码尽可能优雅、可读和简洁。
我会使用 itertools.islice,因为您可以直接使用 sz
中的值作为每个点的步长:
>>> from itertools import islice
>>> it=iter(d)
>>> [sum(islice(it,s)) for s in sz]
[3, 12, 30]
然后您可以根据需要将其转换为元组。
当然需要 iter
以便在最后一个切片停止的地方单步执行元组。否则每个切片将是 d[0:s]