Python 定期对列表/数组进行切片

Python 定期对列表/数组进行切片,python,numpy,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]用于定期切片一个元素,但我不确定是否遗漏了一些明显的内容 编辑:建议的重复问题/答案与我的问题/答案不同。我只是要求定期从较大的列表/数组中切片/提取元素。建议的副本修改现有数组的元素。您想要的比简单的切片更复杂,因

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

[1,2,3,11,12,13,21,22,23,31,32,33,41,42,43]
有没有一种pythonic方法可以帮助我在不使用编写函数的情况下完成这项工作

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


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

您想要的比简单的切片更复杂,因此需要某种(可能相当简单的)函数来完成。我将考虑使用
zip
组合多个片段,例如:

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

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

给定:

>>> 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]
>>> [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]
或者,鉴于:

>>> li=range(1,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]
>>> [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]

另一个选项是逻辑向量子集,类似于:

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


(a-1)%10
按10(周期)查找数组的剩余部分;而
(a-1)%10<3
给出了一个逻辑向量,它为每十个元素中的前三个元素提供了真值。

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]
a=范围(1,51)
[n表示if(n-1)%10<3中的n]
Out[23]:[1,2,3,11,12,13,21,22,23,31,32,33,41,42,43]

您需要使用列表理解谢谢。固定的。这是一个大脑fa#t.可能重复的可能重复(相同的事情只有操作数是数组而不是列表,但这里有
numpy
tag)需要注意的一点是,这只适用于numpy.array。python列表类型不适用于此项。@请更正。OP标记了
numpy
,所以我假设这里是numpy数组。但它是辉煌和优雅的。。。我为什么没想到呢0:(:)
如果numpy==True:选择(此答案)
score+=1