2016-10-16 1 views
0

Ceci est lié à How to append to the end of an empty list?, mais je n'ai pas encore assez de réputation pour y faire des commentaires, alors j'ai posté une nouvelle question ici.Ajout de nouvelles valeurs pour vider des listes imbriquées

Je dois ajouter des termes à une liste de listes vide. Je commence par:

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

Je veux terminer par

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

Talks[eachFilename][SomeTermsRemoved] commence vides. Je ne peux pas préciser que je veux:

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

etc ... (IndexError: liste des index hors de portée). Si je force le remplissage de la chaîne puis que j'essaie de la changer, j'obtiens une chaîne qui est une erreur immuable.

Alors, comment puis-je préciser que je veux Talks[eachFilename][SomeTermsRemoved][0] d'être ['paragraph','text'] et Talks[eachFilename][SomeTermsRemoved][1] d'être ['paragraph','2'] etc?

.append fonctionne, mais ne génère qu'une seule longue colonne, pas un ensemble de listes.

Pour être plus précis, j'ai un certain nombre de listes qui sont initialisés dans un dict

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

eachFilename obtient peuplé à partir d'une liste de fichiers texte, par exemple:

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

StartingText a plusieurs grandes lignes de texte (paragraphes individuels)

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

TermVectors sont peuplées par le paquet NLTK avec une liste de termes, toujours regroupés dans les paragraphes d'origine:

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

Je veux manipuler davantage l'TermVectors, mais garder la structure de la liste des paragraphes d'origine. Cela crée une liste avec 1 terme par ligne:

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) 

Résultat (je perds ma structure de paragraphe):

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

On ne sait pas très bien quelle est la question ici. Comment 'Talks [eachFilename] [SomeTermsRemoved]' est-il défini dans votre code? –

Répondre

0

Une poursuite de l'expérimentation, ainsi que les commentaires, m'ont poussé vers une solution. Plutôt que chaque terme individuel annexant, ce qui génère une longue liste unique, je les termes dans accumulais une liste, puis chaque liste apposé, comme suit:

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) 

Merci tout le monde!

+0

Oh, donc ce n'est pas "TermVectors" qui perd sa forme, mais "TermVectorNoStops" ... vous avez dit le contraire dans votre question. –

+0

Ceci est correct. Mes excuses pour les nombreuses incohérences. J'ai essayé de poser la question d'une manière brève pour gagner du temps, où j'aurais simplement posté mon code exactement. Comme je suis évidemment nouveau sur python, j'ai senti que mon code serait difficile à suivre, et il serait plus facile d'expliquer ma question que d'écrire du code non-pythonien. Merci encore pour votre aide! – Edward

0

Les erreurs que vous déclarez (? Chaînes immuables) ne font pas de sens à moins que votre liste n'est pas vide mais déjà remplie de chaînes. En tout état de cause, si vous commencez avec une liste vide, la façon la plus simple de le remplir est en annexant:

>>> 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']]}} 

Si vous avez une liste vide et essayer de lui assigner en utilisant l'indexation, il lancera une erreur:

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

en aparté, le code comme ceci:

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) 

est très loin d'être propre style Python.N'utilisez pas camelCase, utilisez snake_case. Ne capitalisez pas les variables. En outre, dans votre for-loop de niveau intermédiaire, vous utilisez for eachTerm in range(0, len(Talks[eachFilename]['TermVectors'], mais eachTerm est un int, il est donc plus logique d'utiliser la norme ij ou k. Même idx.

Quoi qu'il en soit, il n'y a aucune raison pour que le code devrait se retourner ceci:

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

Dans ceci:

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

Voici un exemple reproductible (je l'ai fait pour vous, MAIS Vous devez le faire vous-même avant de poser une question):

>>> 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']]}} 
>>> 

L'approche plus pythonique serait quelque chose comme e e suivante:

>>> 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

Désolé @ juanpa.arrivillaga, vous avez raison sur l'erreur pour la liste vide. Je reçois un "IndexError: index de la liste hors de portée" lorsque la liste est initialement vide. Je vais éditer ceci ci-dessus ... – Edward