2016-04-10 7 views
0

Итак, у меня есть массив, и я хочу скопировать каждую строку в этом массиве, начиная с того, где он найдет слово, которое я даю как условие, и заканчивая другой строкой с тем же словом. Например, если у меня есть массив следующим образом:Python Array Копирование из Word в Word

['abcde','Loop: atfg','xyzgh','blabla','blablable Loop','other thing']

Я хочу, например, для поиска цикла слова и скопировать каждую строку в новый массив, пока он снова не находит петлю. Так что он должен вернуть что-то, как это:

['Loop: atfg','xyzgh','blabla','blablable Loop'] 

Любая помощь будет признателен спасибо

ответ

1

следующий код находит индексы уплотнительные е первого и второго элементов, которые содержат ваш search_str

start_index = my_list.index(next(e for e in my_list if search_str in e)) 
end_index = my_list.index(next(e for e in my_list[start_index + 1:] if search_str in e)) 

Чтобы понять, как использовать его:

my_list = ['trash', 'Loop: 1','2','3','4 Loop', 'more trash'] 
search_str = "Loop" 

start_index = my_list.index(next(e for e in my_list if search_str in e)) 
end_index = my_list.index(next(e for e in my_list[start_index + 1:] if search_str in e)) 

result = my_list[start_index:end_index + 1] 

Это может показаться немного страннее, чем петли многострочный, но это немного больше Python- путь:]

+0

Но что бы first_match: index be? потому что эта переменная, кажется, появляется из ниоткуда. Будет ли это start_index? UPDATE: я изменил его на start_index, и он сработал. Благодаря! –

+0

Извините, отредактировал код. Опечатка. – Art

0

Есть, вероятно, более эффективные способы справиться с этим, но я думаю, что хороший старомодный цикл работает лучше всего здесь:

def word_copy(lst, search): 
    res = [] 
    for item in lst: 
     if res: 
      res.append(item) 
      if search in item: 
       return res 

     elif search in item: 
      res.append(item) 
+0

Примечания критерии OPS из * начинается с * и * заканчивается * - нет * содержит * –

0

Попробуйте делать что-то вроде этого:

list = ['abcde','Loop: atfg','xyzgh','blabla','blablable Loop','other thing'] 
if any("loop" in l for l in list): 
+0

Это будет выполнять 'if', где слово «loop» появляется в любом элементе списка - как это помогает запросу OPs? –

0

Петля по списку, ищет первое вхождение, то второе появление:

input = ['abcde','Loop: atfg','xyzgh','blabla','blablable Loop','other thing'] 
target = 'Loop' 

start_index, end_index = None, None 
for i in input: 
    if target in i: 
     if start_index is None: 
      start_index = input.index(i) 
      continue 
     end_index = input.index(i) 
     break 

output = input[start_index : end_index + 1] 
0

со списком:

list = ['abcde','Loop: atfg','xyzgh','blabla','blablable Loop','other thing'] 

я думаю, что вы могли бы попытаться сделать что-то вроде этого, для того, чтобы найти позиции в массиве:

ixs = [i for i, word in enumerate(list) if word.startswith('Loop') or word.endswith('Loop')] 

Тогда вам просто нужно нарезать список:

res = list[ixs[0]:ixs[1]+1] 

Надеюсь, это может вам помочь.

1

Iterate список источник один раз выход:

i = ['abcde','Loop: atfg','xyzgh','blabla','blablable Loop','other thing'] 

def find_range(items): 
    start = False 
    for i in items: 
     if 'Loop' in i: 
      yield i 
      if start: 
       break 

      start = True 
     elif start: 
      yield i 

print list(find_range(i)) 
+0

Получил немного путаницу из-за 'if start: break', но в противном случае приятный :) – Art

+0

Начнем с начала - false. когда Loop соответствует первому времени, start будет установлен в true.Когда Loop снова сопоставляется, начало уже верно, поэтому прерывайте цикл. – Like

0

Я вижу, что некоторые фантазии Однострочник решения. :) же я люблю грубую силу те, которые выглядят больше понимания:

>>> my_list = ['abcde','Loop: atfg','xyzgh','blabla','blablable Loop','other thing'] 
>>> search_str = "(Loop)+" 
>>> out = [] 
>>> count = 0 
>>> for s in my_list: 
...  if count == 2: 
...   break 
...  m = re.search(search_str, s) 
...  if m != None: 
...   count += 1 
...  if count >= 1: 
...   out.append(s) 
... 
>>> out 
['Loop: atfg', 'xyzgh', 'blabla', 'blablable Loop'] 
>>> 
Смежные вопросы