使用索引手动切片列表Python

时间:2018-10-12 05:47:11

标签: python list numpy list-comprehension slice

最小示例

我有一个列表a = [10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,....,]

我想获取一个新列表new_list = [40,50,60,100,110,120,...],即追加第四,第五和第六个值,跳过下三个,追加下三个,依此类推。

我的想法是创建一个名为index的列表:

index = [3,4,5,9,10,11,...] new_list = [a[i] for i in index] # This should give me what I want

但是如何创建列表index?我知道np.arange具有step选项,但这仅用于值之间的间隔。

3 个答案:

答案 0 :(得分:4)

这是一种方法-

[a[i] for i in range(len(a)) if i%6>=3]

样品运行-

In [49]: a = [10,20,30,40,50,60,70,80,90,100,110,120,130,140,150]

In [50]: [a[i] for i in range(len(a)) if i%6>=3]
Out[50]: [40, 50, 60, 100, 110, 120]

答案 1 :(得分:4)

这是在Divakar's nice logic上建立的Python内置函数enumerate的改进和更快的版本。

In [4]: lst = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150]
In [6]: [item for idx, item in enumerate(lst) if idx%6 >= 3]
Out[6]: [40, 50, 60, 100, 110, 120]

为什么此版本更好更好?

In [10]: lst = range(10, 100000, 10)       

In [11]: %timeit [lst[idx] for idx in range(len(lst)) if idx % 6 >= 3]
1.1 ms ± 22.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [12]: %timeit [item for idx, item in enumerate(lst) if idx % 6 >= 3]
788 µs ± 8.67 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

增益超过300微秒!此外,enumerate()更直接直观(参见loop like a native

答案 2 :(得分:1)

您可以生成连续3个增量并重复3个元素的索引元素

a = np.asarray([10,20,30,40,50,60,70,80,90,100,110,120,130,140,150])
b = np.tile(np.arange(1,4),int(len(a)/6)+1) + np.repeat(np.arange(3,int(len(a)/2)+3,3),3)
a.take(b)

出局:

array([ 50,  60,  70,  80,  90, 100, 110, 120, 130])

说明

np.tile(np.arange(1,4),int(len(a)/6)+1)
#array([1, 2, 3, 1, 2, 3, 1, 2, 3])

np.repeat(np.arange(3,int(len(a)/2)+3,3),3)
#array([3, 3, 3, 6, 6, 6, 9, 9, 9])