Ручная нарезка списка с использованием их индексов, Python - PullRequest
0 голосов
/ 12 октября 2018

Минимальный пример

У меня есть список 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 голосов
/ 12 октября 2018

Вы можете сгенерировать элементы индекса с непрерывным 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)

Out:

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])
0 голосов
/ 12 октября 2018

Вот улучшенная и более быстрая версия, использующая встроенную функцию 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() является более простым и интуитивно понятным (cf loop как нативный )

0 голосов
/ 12 октября 2018

Вот один из способов -

[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]
...