最小示例
我有一个列表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选项,但这仅用于值之间的间隔。
答案 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])