我有一个Python脚本,它将整数列表作为输入,我需要一次使用四个整数.不幸的是,我无法控制输入,或者我将它作为四元素元组列表传入.目前,我正在以这种方式迭代它:
for i in xrange(0, len(ints), 4):
# dummy op for example code
foo += ints[i] * ints[i + 1] + ints[i + 2] * ints[i + 3]
Run Code Online (Sandbox Code Playgroud)
它看起来很像"C-think",这让我怀疑有更多的pythonic方式来处理这种情况.迭代后会丢弃该列表,因此无需保留.也许这样的事情会更好吗?
while ints:
foo += ints[0] * ints[1] + ints[2] * ints[3]
ints[0:4] = []
Run Code Online (Sandbox Code Playgroud)
但是,仍然没有"感觉"正确.: - /
基于任意数量的索引将列表拆分为多个部分的最佳方法是什么?例如,给出下面的代码
indexes = [5, 12, 17]
list = range(20)
Run Code Online (Sandbox Code Playgroud)
返回这样的东西
part1 = list[:5]
part2 = list[5:12]
part3 = list[12:17]
part4 = list[17:]
Run Code Online (Sandbox Code Playgroud)
如果没有索引,则应返回整个列表.
我正在寻找一种快速,干净,pythonic的方法来将列表划分为n个几乎相等的分区.
partition([1,2,3,4,5],5)->[[1],[2],[3],[4],[5]]
partition([1,2,3,4,5],2)->[[1,2],[3,4,5]] (or [[1,2,3],[4,5]])
partition([1,2,3,4,5],3)->[[1,2],[3,4],[5]] (there are other ways to slice this one too)
Run Code Online (Sandbox Code Playgroud)
这里有几个答案迭代列表切片非常接近我想要的,除了它们专注于列表的大小,我关心列表的数量(其中一些也填充无).显然,这些很容易转换,但我正在寻找最佳实践.
同样,人们在这里指出了很好的解决方案如何将列表拆分成大小均匀的块?对于一个非常类似的问题,但我对分区的数量比特定大小更感兴趣,只要它在1以内.再次,这是可以轻易转换的,但我正在寻找最佳实践.
我正在寻找一种"浏览"Python迭代器的方法.也就是说,我想将一个给定的迭代器iter和page_size与另一个迭代器包装起来,该迭代器将把它作为一系列"页面"从iter返回.每个页面本身都是一个迭代器,最多包含page_size迭代.
我查看了itertools,我看到的最接近的是itertools.islice.在某些方面,我想要的是与itertools.chain相反- 而不是将一系列迭代器链接到一个迭代器中,我想将迭代器分解为一系列较小的迭代器.我期待在itertools中找到一个分页功能,但找不到.
我想出了以下的传呼器类和演示.
class pager(object):
"""
takes the iterable iter and page_size to create an iterator that "pages through" iter. That is, pager returns a series of page iterators,
each returning up to page_size items from iter.
"""
def __init__(self,iter, page_size):
self.iter = iter
self.page_size = page_size
def __iter__(self):
return self
def next(self):
# if self.iter has not been exhausted, return the next slice
# I'm using …Run Code Online (Sandbox Code Playgroud) 给出一个清单
A = [1 2 3 4 5 6]
Run Code Online (Sandbox Code Playgroud)
是否有任何惯用(Pythonic)方式迭代它就好像它一样
B = [(1, 2) (3, 4) (5, 6)]
Run Code Online (Sandbox Code Playgroud)
索引除外?感觉就像C的延续:
for a1,a2 in [ (A[i], A[i+1]) for i in range(0, len(A), 2) ]:
Run Code Online (Sandbox Code Playgroud)
我不禁觉得应该有一些聪明的黑客使用itertools或切片或其他东西.
(当然,一次两个只是一个例子;我想要一个适用于任何n的解决方案.)
编辑:在Python中一次迭代字符串2(或n)个字符,但即使是最干净的解决方案(使用zip接受)也不能很好地推广到更高的n而没有列表理解和*-notation.