2013-11-12 2 views
3

У меня есть список булевых. У меня также есть список начальных и конечных индексов. В моем списке булевых я хочу, чтобы каждое значение было True, если оно не лежит в одном из срезов, определенных в списке индексов. То, что я написал, чувствует себя очень неуклюжим, любые предложения по его улучшению?Вставить повторяющееся значение во всех средах списка

bools = [True] * 15 
events = [(3, 5), (11, 16)] 
for e in events: 
    bools[e[0]:e[1]] = [False for x in range(*e)] 

конкретно, я не люблю [False for x in range(*e)] часть. Если я начинаю возиться с кусочками, то range(*e) начинает запутаться, например:

bools[e[0]:e[1]+2] = [False for x in range(e[0], e[1]+2)] 

Что бы очень приятно, если бы синтаксис, чтобы каждое значение в списке/секции принимают одинаковое значение, например

bools[e[0]:e[1]+2] = False 

Но это, очевидно, неправильный синтаксис. Есть идеи?

ответ

0

Заинтересованы в использовании numpy?

bools[e[0]:e[1]+2] = False 

работает в numpy. Вы также можете напрямую создать свой собственный slice objects, который позволит вам сделать что-то вроде этого

slices = [np.s_[3:6], np.s_[11:17]] 
for s in slices: 
    bools[s] = False 

с использованием s_ поставляется с полной поддержкой для нарезки синтаксиса (размер шага, индексирование с конца списка, elipsis), а не просто перечисляя ряд

+0

совершенны, спасибо. –

0

Я просто сделать это:

events = [(3, 5), (11, 16)] 
bools = [True] * 16 
for start, end in events: 
    for index in range(start, end): 
     bools[index] = False 
1
from itertools import repeat 
for e in events: 
    bools[e[0]: e[1]] = repeat(False, e[1] - e[0]) 
+0

Конечно, это работает, только если вы избежите отрицательных индексов. Но даже это довольно легко исправить, создав «срез (e [0], e [1])» и вызывая его «индексы (bools)», а затем используя это вместо 'e [0]: e [1] '. – abarnert

Смежные вопросы