定期切片列表/数组

时间:2017-02-10 03:47:23

标签: python numpy

假设我有a = range(1,51)。我如何切片a来创建一个如下所示的新列表:

[1,2,3,11,12,13,21,22,23,31,32,33,41,42,43]

是否有一种pythonic方法可以帮助我在没有编写函数的情况下执行此操作?

我知道[start:stop:step]定期切片一个元素,但我不确定我是否遗漏了一些明显的东西。

编辑:建议的重复问题/答案与我的问题不同。我只是要求从更大的列表/数组中定期切片/提取元素。建议的副本修改现有数组的元素。

4 个答案:

答案 0 :(得分:3)

您可以使用逻辑向量子集进行另一种选择,例如:

a[(a - 1) % 10 < 3]
# array([ 1,  2,  3, 11, 12, 13, 21, 22, 23, 31, 32, 33, 41, 42, 43])

(a - 1) % 10查找数组的余数为10(句点);并且(a - 1) % 10 < 3给出了一个逻辑向量,它给出了每十个元素的前三个元素的真实性。

答案 1 :(得分:2)

你想要的东西比简单的切片更复杂,所以你需要某种(可能相当简单的)功能来完成它。我将使用zip来组合多个切片,例如:

reduce(lambda a,b:a+b, map(list, zip(a[1::10], a[2::10], a[3::10])))

答案 2 :(得分:2)

假设:

>>> li=range(1,52)

你可以这样做:

>>> [l for sl in [li[i:i+3] for i in range(0,len(li),10)] for l in sl]
[1, 2, 3, 11, 12, 13, 21, 22, 23, 31, 32, 33, 41, 42, 43, 51]

或者,如果您只想要完整的子列表:

>>> [l for sl in [li[i:i+3] for i in range(0,len(li),10)] for l in sl if len(sl)==3]
[1, 2, 3, 11, 12, 13, 21, 22, 23, 31, 32, 33, 41, 42, 43]

或者,给定:

>>> li=range(1,51)

然后您不需要测试子列表:

>>> [l for sl in [li[i:i+3] for i in range(0,len(li),10)] for l in sl]
[1, 2, 3, 11, 12, 13, 21, 22, 23, 31, 32, 33, 41, 42, 43]

答案 3 :(得分:1)

Psidom的答案的索引数学也可以适应列表理解

a = range(1,51)

[n for n in a if (n - 1) % 10 < 3]

Out[23]: [1, 2, 3, 11, 12, 13, 21, 22, 23, 31, 32, 33, 41, 42, 43]