2015-10-02 4 views
2

У меня есть строка, из которой я хочу извлечь гласные и согласные вместе со своими индексами.Python: просмотр списка + фильтр

Я имею в виду:

a = "HELLO" 
list_ = list(a) 
vow = [(x, i) for i,x in enumerate(list_) if x in ['A', 'E', 'I', 'O', 'U']] 
cons = [(x, i) for i, x in enumerate(list_) if x not in j for j in list_ if j in ['A', 'E', 'I', 'O', 'U']] 

Однако я получаю NameError (говоря j не определен). Почему я не могу вставить свое понимание списка.

Мой желаемый результат:

vows : [('E', 1), ('O', 4)] 
cons : [('H', 0), ('L', 2), ('L', 3)] 
+0

Может быть, потому, что вы используете два список понимания сразу , –

+0

Перечисления могут быть вложенными, что-то не так в том, как я это делаю –

ответ

2

Правильный синтаксис будет явно сделать внутренний цикл список понимание:

cons = [(x, i) for i, x in enumerate(list_) if x not in [ j for 
      j in list_ if j in ['A', 'E', 'I', 'O', 'U']]] 

Но здесь правильный способ получить согласные бы просто (как уже было сказано другими):

cons = [(x, i) for i,x in enumerate(list_) if x not in ['A', 'E', 'I', 'O', 'U']] 
2

Вы чрезмерно усложнять его

a = "HELLO" 
list_ = list(a) 
vow = [(x, i) for i,x in enumerate(list_) if x in ['A', 'E', 'I', 'O', 'U']] 
cons = [(x, i) for i, x in enumerate(list_) if x not in ['A', 'E', 'I', 'O', 'U']] 
ответ

знакомства Ананда S Кумара подробнее :)


ошибка в вашем вложенности является то, что вам нужно снова вставить его

cons = [(x, i) for i, x in enumerate(list_) if x not in [j for j in list_ if j in ['A', 'E', 'I', 'O', 'U']]] 
4

Проблема с пониманием вашего второго списка заключается в том, что в идеале состояние должно начинаться в конце (после второго цикла for, только тогда j мы были бы доступны). Но вам это действительно не нужно, просто проверьте, нет ли x в списке гласных. Пример -

cons = [(x, i) for i,x in enumerate(list_) if x not in ['A', 'E', 'I', 'O', 'U']] 

Demo -

>>> a = "HELLO" 
>>> list_ = list(a) 
>>> vow = [(x, i) for i,x in enumerate(list_) if x in ['A', 'E', 'I', 'O', 'U']] 
>>> cons = [(x, i) for i,x in enumerate(list_) if x not in ['A', 'E', 'I', 'O', 'U']] 
>>> vow 
[('E', 1), ('O', 4)] 
>>> cons 
[('H', 0), ('L', 2), ('L', 3)] 

Вы можете сделать это немного быстрее, используя set для vowels и вы на самом деле не нужно list_, вы можете перечислить через a себя, и получить точно такой же результат. Пример -

vowel_set = {'A', 'E', 'I', 'O', 'U'} 
vow = [(x, i) for i,x in enumerate(a) if x in vowel_set] 
cons = [(x, i) for i,x in enumerate(a) if x not in vowel_set] 

Демо -

>>> a = "HELLO" 
>>> vowel_set = {'A', 'E', 'I', 'O', 'U'} 
>>> vow = [(x, i) for i,x in enumerate(a) if x in vowel_set] 
>>> cons = [(x, i) for i,x in enumerate(a) if x not in vowel_set] 
>>> vow 
[('E', 1), ('O', 4)] 
>>> cons 
[('H', 0), ('L', 2), ('L', 3)] 
2

Правило № 1 о вложенных ЛЦ в Python: Цикл внешняя идет в первую очередь.

cons = [(x, i) for j in list_ if j in ['A', 'E', 'I', 'O', 'U'] for i, x in enumerate(list_) if x not in j] 

Но это даст неправильный результат, так как вы должны просто использовать not in в первую очередь вместо этого.

2

Вы можете проверить на членство в строке:

>>> 'I' in 'AEIOU' 
True 

Вы можете преобразовать каждый символ Acter в строке члена набора, чуть более быстрый поиск:

>>> 'Z' in set('AEIOU') 
False 

Вам не нужен второй внутренний цикл:

>>> vowels = set('AEIOU') 
>>> vows = [(char, index) for index, char in enumerate(word) if char in vowels] 
>>> cons = [(char, index) for index, char in enumerate(word) if char not in vowels] 
+0

Но как вы можете так получить индексы? 'if 'L' in 'HELLO': print 'HELLO'.find (' L ')' Это даст только индекс первого появления 'L' (здесь 2) –

+0

Мое различие заключается в том, чтобы проверить строка гласных, а не список гласных. –

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