使用索引手动切割列表,Python

4

最简单的例子

我有一个列表 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] # 这应该可以得到我想要的结果

但是我如何创建列表 index?我知道 np.arange 有步长选项,但那只适用于在值之间进行间隔。

3个回答

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]

4

这是一个使用Python内置函数 enumerate 进行改进和加速的版本,基于 Divakar的优秀逻辑

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()更加直观和简单易懂(参见像本地人一样循环


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])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接