假设我有a = range(1,51)
。我如何切片a
来创建一个如下所示的新列表:
[1,2,3,11,12,13,21,22,23,31,32,33,41,42,43]
是否有一种pythonic方法可以帮助我在没有编写函数的情况下执行此操作?
我知道[start:stop:step
]定期切片一个元素,但我不确定我是否遗漏了一些明显的东西。
编辑:建议的重复问题/答案与我的问题不同。我只是要求从更大的列表/数组中定期切片/提取元素。建议的副本修改现有数组的元素。
答案 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]