Как получить последовательные элементы между двумя одинаковыми элементами в списке? - PullRequest
0 голосов
/ 28 февраля 2019

Например, у меня есть список l = ['.','b','w','w','w','b','.','.'], как мне пройти по этому списку и вернуть индексы трех w, которые находятся между b.

Мне нужно иметь возможность обрабатывать такие случаи, как l = ['.','b','w','w','w','w','.','.'], где нет второго 'b', в этом случае ничего не будет возвращено.Другие возможные случаи: l = ['.','b','w','w','.','.','b','.'], в этом случае также ничего не будет возвращено.Я должен быть в состоянии получить последовательные w между b.До сих пор я пробовал это:

l = ['.','b','w','w','.','.','.','.']
q = []
loop = False
for i in range(len(l)):
    if l[i] == 'b' and l[i+1] == 'w':
        loop = True
    elif l[i] == 'w' and l[i+1] == 'w' and l[i+2] == '.':
        pass
    elif l[i] == 'w' and l[i-1] == 'b' and l[i+1] == 'w' and loop == True:
        q.append(i)
    elif l[i-1] == 'w' and l[i] == 'w' and l[i+1] == 'w' and loop == True:               q.append(i)
    elif l[i] == 'w' and l[i+1] == 'b' and loop == True:
        q.append(i)
        loop = False
        break

print(q)

Но это не обрабатывает все случаи и иногда возвращает ошибки.Как я могу сделать это без NumPy ?

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Попробуйте это:

ind = [i for i, e in enumerate(l) if e == 'b']
q = []

if len(ind) == 2:
    w = l[ind[0]+1: ind[1]]
    if set(w) == {'w'}:
        for i in range(ind[0]+1, ind[1]):        
            q.append(i)
0 голосов
/ 28 февраля 2019

попробуйте

import re
l = ['.','b','w','w','b','.','.','.']
s = ''.join(l)

# print(re.findall('[b]([w]+)[b]',s))
# print(re.findall('[w]([b]+)[w]',s))

if(re.findall('[b]([w]+)[b]',s)):
    witer =re.finditer('w',s)
    wpos = []
    for i in witer:
        wpos.append(i.start())
    print('reverse', wpos)


if(re.findall('[w]([b]+)[w]',s)):
    biter =re.finditer('b',s)
    bpos = []
    for i in biter:
        bpos.append(i.start())
    print('reverse', bpos)

...