从列表中取出每个第n个块

Bra*_*mon 7 python python-itertools python-3.x

给出一个清单:

import string
a = list(string.ascii_lowercase)
Run Code Online (Sandbox Code Playgroud)

什么是返回m个元素的每第n个块的Pythonic方法?请注意,这与仅返回每个第n个元素不同.

获得3个元素的3个块中的一个的所需结果(取3,跳过6,取3,跳过6 ......):

['a', 'b', 'c', 'j', 'k', 'l', 's', 't', 'u']
Run Code Online (Sandbox Code Playgroud)

我可以这样做:

import itertools
s1 = a[::9]
s2 = a[1::9]
s3 = a[2::9]    
res = list(itertools.chain.from_iterable(zip(s1,s2, s3)))
Run Code Online (Sandbox Code Playgroud)

有更干净的方式吗?

Mos*_*oye 3

对于选择和跳过的固定顺序,您可以对窗口总长度(此处为 9)取模的索引进行包装,并仅选择低于给定阈值 3 的索引:

lst = [x for i, x in enumerate(a) if i % 9 < 3]
print(lst)
# ['a', 'b', 'c', 'j', 'k', 'l', 's', 't', 'u']
Run Code Online (Sandbox Code Playgroud)

您可以将其变成一个函数,使其使用起来更加直观:

def select_skip(iterable, select, skip):
    return [x for i, x in enumerate(iterable) if i % (select+skip) < select]  

print(select_skip(a, select=3, skip=6))
# ['a', 'b', 'c', 'j', 'k', 'l', 's', 't', 'u']
Run Code Online (Sandbox Code Playgroud)