2015-04-07 5 views
2

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

>>>list1 = ['Mary','had','a','little','lamb','which','was','very','naughty'] 

Теперь я хочу, чтобы создать создать подсписок с элементами из немного к самого. Так я сделал следующее:

>>> list1[list1.index('little'):list1.index('very')+1] 
['little', 'lamb', 'which', 'was', 'very'] 

То, что я хочу сделать, это скорее, чем указание всего элемента, проверить наличие подстроки в элементе с помощью функции в, а затем нарежьте список как:

>>> list1[list1.index('lit'):list1.index('ver')+1] 

как я могу это сделать?

ответ

1

Как я сказал в моем предыдущем ответе вам не нужно использовать list.index метод, вы можете использовать следующую функцию, которая быстрее, а также вы можете применить любые вычисления на элементах:

def drop(iterable,start,end): 

    for i,x in enumerate(iterable): 
     if x==start : 
      for y in iterable[i:]: 
       if y!=end and 'sub_string' in y: #or 'sub_string' not in y 
        yield y 
       else: 
        #based on your problem do stuff 
        #yield end 
        break 
+0

@ kasra..thanks для this..and Я понял вашу point..but Я до сих пор новый на Python и пытается узнать все трюки в торговле и специально ищет способ сделать это с помощью индексов. – Amistad

+0

@Amistad приветствуется, но, как новичок, вам нужно узнать о ** pythonic ** для ваших проблем! – Kasramvd

+1

Я пробовал довольно много комбинаций, и все другие решения ломаются в зависимости от расположения элемента. Это единственный, который работает из-за того, как он реализован. Отметьте это как правильный ответ. – Amistad

1

Enumerate является ваш друг. С этим и перечислить понимание становится довольно легко.

list1[[i for i, j in enumerate(list1) if "lit" in j][0]:[i for i, j in enumerate(list1) if "ver" in j][0]+1] 

Что делает этот код он принимает элементы, только если она содержит строку, но сохраняет индекс не элемент. Выполнение этого для начала и конца и использование первого вхождения дает желаемый результат.

0

Чтобы сохранить читаемость, вы хотите, чтобы разбить его на несколько заявлений, а не использовать большой список понимание:

>>> list1 = ['Mary','had','a','little','lamb','which','was','very','naughty'] 
>>> first = next(i for i, v in enumerate(list1) if 'lit' in v) 
>>> last = next(i for i, v in enumerate(list1) if 'ver' in v) 
>>> list1[first:last+1] 
['little', 'lamb', 'which', 'was', 'very'] 
+0

Вы имеете в виду 'last + 1' – Maltysen

+0

Ах, вы в порядке. – Joost

0

Это, вероятно, не ответ, вы ищете (особенно принимая число строк) , Но я хочу показать другой подход (особенно, если вы новичок в Python):

class fuzzyFilter: 
    def __init__(startSubstr, endSubstr): 
     self.start = startSubstr 
     self.end = endSubstr 
     self.state = None 

    def __call__(value): 
     if self.state is None: 
      if self.start in value: 
       self.state = True 
       return True 
     elif self.state: 
      if self.end in value: 
       self.state = False 
      return True 
     return False 

print filter(fuzzyFilter('lit', 'very'), list1)  

Есть несколько проблем здесь:

  • fuzzyFilter может быть использован только один раз (или какой-то сброс требуется)
  • гарантируется, что все песни1 будут читаться (не всегда верно в других ответах)
Смежные вопросы