2016-10-16 6 views
0

Это связано с How to append to the end of an empty list?, но у меня пока нет достаточной репутации, чтобы комментировать там, поэтому я разместил здесь новый вопрос.Добавление новых значений в пустые вложенные списки

Мне нужно добавить термины в пустой список списков. Я начинаю с:

Talks[eachFilename][TermVectors]= 
     [['paragraph','1','text'], 
     ['paragraph','2','text'], 
     ['paragraph','3','text']] 

Я хочу закончить с

Talks[eachFilename][SomeTermsRemoved]= 
     [['paragraph','text'], 
     ['paragraph','2'], 
     ['paragraph']] 

Talks[eachFilename][SomeTermsRemoved] начинается пустой. Я не могу определить, что я хочу:

Talks[eachFilename][SomeTermsRemoved][0][0]='paragraph' 
Talks[eachFilename][SomeTermsRemoved][0][1]='text' 
Talks[eachFilename][SomeTermsRemoved][1][0]='paragraph' 

и т.д ... (IndexError: индекс списка из диапазона). Если я заставляю заполнять строку, а затем пытаюсь ее изменить, я получаю строки неизменной.

Итак, как же я определяю, что я хочу Talks[eachFilename][SomeTermsRemoved][0] быть ['paragraph','text'] и Talks[eachFilename][SomeTermsRemoved][1] быть ['paragraph','2'] и т.д.?

.append работает, но генерирует только один длинный столбец, а не набор списков.

Чтобы быть более точным, у меня есть несколько списков, которые инициализируются внутри Словаря

Talks = {} 
Talks[eachFilename]= {} 
Talks[eachFilename]['StartingText']=[] 
Talks[eachFilename]['TermVectors']=[] 
Talks[eachFilename]['TermVectorsNoStops']=[] 

eachFilename получает заселенный из списка текстовых файлов, например:

Talks[eachFilename]=['filename1','filename2'] 

StartingText имеет несколько длинные строки текста (отдельные абзацы)

Talks[filename1][StartingText]=['This is paragraph one','paragraph two'] 

TermVectors населенны пакетом NLTK со списком терминов, по-прежнему, сгруппированным в оригинальных пунктах:

Talks[filename1][TermVectors]= 
    [['This','is','paragraph','one'], 
     ['paragraph','two']] 

Я хочу, чтобы в дальнейшем манипулировать TermVectors, но сохранить первоначальную структуру списка пункта. Это создает список с 1 сроком на линию:

for eachFilename in Talks: 
    for eachTerm in range(0, len(Talks[eachFilename]['TermVectors'])): 
     for term in Talks[eachFilename]['TermVectors'][ eachTerm ]: 
      if unicode(term) not in stop_words: 
       Talks[eachFilename]['TermVectorsNoStops'].append(term) 

Результат (я потеряю свою структуру абзаца):

Talks[filename1][TermVectorsNoStops]= 
    [['This'], 
     ['is'], 
     ['paragraph'], 
     ['one'], 
     ['paragraph'], 
     ['two']] 
+0

Непонятно, в чем вопрос. Как в вашем коде определяется 'Talks [eachFilename] [SomeTermsRemoved]'? –

ответ

0

Некоторые продолжающиеся эксперименты, наряду с комментариями, заставили меня двигаться к решению. Вместо добавления каждого отдельного термина, который генерирует один длинный список, я накопил термины в список, а затем добавляются каждый список следующим образом:

for eachFilename in Talks: 
    for eachTerm in range(0, len(Talks[eachFilename]['TermVectors'])): 
     term_list = [ ] 
     for term in Talks[eachFilename]['TermVectors'][ eachTerm ]: 
      if unicode(term) not in stop_words: 
       term_list.append(term) 
     Talks[eachFilename]['TermVectorsNoStops'].append(term) 

Спасибо всем!

+0

О, так что это не 'TermVectors', который теряет свою форму, а' TermVectorNoStops' ... вы сказали обратное в своем вопросе. –

+0

Это правильно. Приношу свои извинения за многочисленные несоответствия. Я попытался кратко задать вопрос, чтобы сэкономить время людей, где я должен был просто разместить свой код точно. Поскольку я, очевидно, новичок в python, я чувствовал, что мой код будет трудно следовать, и было бы легче объяснить мой вопрос, чем писать путать непифонический код. Спасибо еще раз за помощь! – Edward

0

Ошибки вы сообщаете (? Ниточки неизменны) не имеет никакого смысла, если ваш список на самом деле не пуст, а уже заполнен строками. В любом случае, если вы начнете с пустым списком, то самым простым способом, чтобы заполнить это путь добавления:

>>> talks = {} 
>>> talks['each_file_name'] = {} 
>>> talks['each_file_name']['terms_removed'] = [] 
>>> talks['each_file_name']['terms_removed'].append(['paragraph','text']) 
>>> talks['each_file_name']['terms_removed'].append(['paragraph','2']) 
>>> talks['each_file_name']['terms_removed'].append(['paragraph']) 
>>> talks 
{'each_file_name': {'terms_removed': [['paragraph', 'text'], ['paragraph', '2'], ['paragraph']]}} 
>>> from pprint import pprint 
>>> pprint(talks) 
{'each_file_name': {'terms_removed': [['paragraph', 'text'], 
             ['paragraph', '2'], 
             ['paragraph']]}} 

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

>>> empty_list = [] 
>>> empty_list[0] = 10 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: list assignment index out of range 

Как и в сторону, такой код:

for eachFilename in Talks: 
    for eachTerm in range(0, len(Talks[eachFilename]['TermVectors'])): 
     for term in Talks[eachFilename]['TermVectors'][ eachTerm ]: 
      if unicode(term) not in stop_words: 
       Talks[eachFilename]['TermVectorsNoStops'].append(term) 

очень далеко от правильного стиля Python.Не используйте camelCase, используйте snake_case. Не используйте значения переменных. Кроме того, в вашем среднем уровне for-loop вы используете for eachTerm in range(0, len(Talks[eachFilename]['TermVectors'], но eachTerm - это int, поэтому имеет смысл использовать стандарт ij или k. Даже idx.

Во всяком случае, нет никаких причин, почему этот код должен быть поворот это:

Talks[filename1][TermVectors] = 
    [['This','is','paragraph','one'], 
     ['paragraph','two']] 

В это:

Talks[filename1][TermVectors] = 
    [['This'], 
     ['is'], 
     ['paragraph'], 
     ['one'], 
     ['paragraph'], 
     ['two']] 

Вот воспроизводимый пример (я сделал это для вас, НО Вы должны сделать это сами перед тем, опубликовав вопрос):

>>> pprint(talks) 
{'file1': {'no_stops': [], 
      'term_vectors': [['This', 'is', 'paragraph', 'one'], 
          ['paragraph', 'two']]}, 
'file2': {'no_stops': [], 
      'term_vectors': [['This', 'is', 'paragraph', 'three'], 
          ['paragraph', 'four']]}} 
>>> for file in talks: 
... for i in range(len(talks[file]['term_vectors'])): 
...  for term in talks[file]['term_vectors'][i]: 
...  if term not in stop_words: 
...   talks[file]['no_stops'].append(term) 
... 
>>> pprint(file) 
'file2' 
>>> pprint(talks) 
{'file1': {'no_stops': ['This', 'paragraph', 'one', 'paragraph'], 
      'term_vectors': [['This', 'is', 'paragraph', 'one'], 
          ['paragraph', 'two']]}, 
'file2': {'no_stops': ['This', 'paragraph', 'paragraph', 'four'], 
      'term_vectors': [['This', 'is', 'paragraph', 'three'], 
          ['paragraph', 'four']]}} 
>>> 

Чем больше вещий подход будет что-то вроде го e следующее:

>>> pprint(talks) 
{'file1': {'no_stops': [], 
      'term_vectors': [['This', 'is', 'paragraph', 'one'], 
          ['paragraph', 'two']]}, 
'file2': {'no_stops': [], 
      'term_vectors': [['This', 'is', 'paragraph', 'three'], 
          ['paragraph', 'four']]}} 
>>> for file in talks.values(): 
... file['no_stops'] = [[term for term in sub if term not in stop_words] for sub in file['term_vectors']] 
... 
>>> pprint(talks) 
{'file1': {'no_stops': [['This', 'paragraph', 'one'], ['paragraph']], 
      'term_vectors': [['This', 'is', 'paragraph', 'one'], 
          ['paragraph', 'two']]}, 
'file2': {'no_stops': [['This', 'paragraph'], ['paragraph', 'four']], 
      'term_vectors': [['This', 'is', 'paragraph', 'three'], 
          ['paragraph', 'four']]}} 
>>> 
+0

Извините @ juanpa.arrivillaga, вы правильно указали ошибку для пустого списка. Я получаю индекс IndexError: list вне диапазона, когда список изначально пуст. Я отредактирую это выше ... – Edward

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