Итерация вложенного списка - PullRequest
0 голосов
/ 04 января 2019

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

corpus = ['he is a brave king', 'she is a kind queen', 'he is a young boy', 'she is a gentle girl']

corpus = [_.split(' ') for _ in corpus]

[['он', 'есть', 'a', 'храбрый', 'король'], ['она', 'is', 'a', 'kind', 'queen'], [' он ',' есть ',' a ',' молодой ',' мальчик '], [' она ',' есть ',' a ',' нежный ',' девочка ']]

Таким образом, вышеприведенный вывод был представлен как вложенный список, и я намеревался удалить стоп-слова, например. 'is', 'a'.

for _ in range(0, len(corpus)):
     for x in corpus[_]:
         if x == 'is' or x == 'a':
             corpus[_].remove(x)

[['он', 'a', 'храбрый', 'король'], ['она', 'a', 'kind', 'queen'], ['he', 'a', ' молодой ',' мальчик '], [' она ',' a ',' нежный ',' девочка ']]

Вывод показывает, что цикл пропускается к следующему подсписку после удаления 'is' в каждом подсписке вместо полной итерации.

В чем причина этого? Индекс? Если да, то как решить, если я хотел бы сохранить вложенную структуру.

Ответы [ 3 ]

0 голосов
/ 04 января 2019

вложенный = [вход ()]

вложенный = [i.split () для i во вложенном]

0 голосов
/ 04 января 2019

Может быть, вы можете определить пользовательский метод для отклонения элементов, соответствующих определенному условию. Аналогичен itertools (например: itertools.dropwise ).

def reject_if(predicate, iterable):
  for element in iterable:
    if not predicate(element):
      yield element

Если у вас есть метод, вы можете использовать этот способ:

stopwords = ['is', 'and', 'a']
[ list(reject_if(lambda x: x in stopwords, ary)) for ary in corpus ]
#=> [['he', 'brave', 'king'], ['she', 'kind', 'queen'], ['he', 'young', 'boy'], ['she', 'gentle', 'girl']]
0 голосов
/ 04 января 2019

Все ваши коды верны, за исключением незначительных изменений: используйте [:] для перебора содержимого с использованием копии списка и избегайте внесения изменений посредством ссылки на исходный список. В частности, вы создаете копию списка как lst_copy = lst[:]. Это один из способов копирования среди нескольких других (подробные способы см. здесь ). Когда вы перебираете исходный список и изменяете список, удаляя элементы, счетчик создает проблему, с которой вы столкнулись.

for _ in range(0, len(corpus)):
     for x in corpus[_][:]: # <--- create a copy of the list using [:]
         if x == 'is' or x == 'a':
             corpus[_].remove(x)

OUTPUT

[['he', 'brave', 'king'],
 ['she', 'kind', 'queen'],
 ['he', 'young', 'boy'],
 ['she', 'gentle', 'girl']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...