2014-04-17 5 views
0

J'essaye de redresser un programme qui prend une liste imbriquée, et renvoie une nouvelle liste qui enlève les noms propres.se débarrasser des noms propres dans une liste imbriquée python

Voici un exemple:

L = [['The', 'name', 'is', 'James'], ['Where', 'is', 'the', 'treasure'], ['Bond', 'cackled', 'insanely']] 

Je veux revenir:

['the', 'name', 'is', 'is', 'the', 'tresure', 'cackled', 'insanely'] 

Prenez note que 'où' est supprimé. C'est ok car il n'apparaît nulle part ailleurs dans la liste imbriquée. Chaque liste imbriquée est une phrase. Mon approche est d'ajouter chaque premier élément de la liste imbriquée à une newList. Ensuite, je compare pour voir si les éléments de la liste newList sont dans la liste imbriquée. Je mettrais en minuscules l'élément dans la newList pour vérifier. Je suis à moitié fait avec ce programme, mais je cours une erreur quand j'essaye de retirer l'élément de newList à la fin. Une fois la nouvelle liste mise à jour, je souhaite supprimer les éléments de la liste imbriquée qui se trouvent dans la liste newList. J'ajouterais enfin tous les éléments de la liste imbriquée à une nouvelle liste et aux minuscules. Ça devrait le faire.

Si quelqu'un a une approche plus efficace, je serais ravi d'écouter.

def lowerCaseFirst(L): 
    newList = [] 
    for nestedList in L: 
     newList.append(nestedList[0]) 
    print newList 

    for firstWord in newList: 
     sum = 0 
     firstWord = firstWord.lower() 
     for nestedList in L: 
      for word in nestedList[1:]: 
       if firstWord == word: 
        print "yes" 

        sum = sum + 1 
      print newList 
     if sum >= 1: 
      firstWord = firstWord.upper() 
      newList.remove(firstWord) 
    return newList 

Notez ce code n'est pas terminé en raison de l'erreur dans la seconde à la dernière ligne

est ici avec le newerList (updatedNewList):

def lowerCaseFirst(L): 
    newList = [] 
    for nestedList in L: 
     newList.append(nestedList[0]) 
    print newList 
    updatedNewList = newList 
    for firstWord in newList: 
     sum = 0 
     firstWord = firstWord.lower() 
     for nestedList in L: 
      for word in nestedList[1:]: 
       if firstWord == word: 
        print "yes" 

        sum = sum + 1 
      print newList 
     if sum >= 1: 
      firstWord = firstWord.upper() 
      updatedNewList.remove(firstWord) 
    return updatedNewList 

message d'erreur:

Traceback (most recent call last): 
    File "/Applications/WingIDE.app/Contents/MacOS/src/debug/tserver/_sandbox.py", line 1, in <module> 
    # Used internally for debug sandbox under external interpreter 
    File "/Applications/WingIDE.app/Contents/MacOS/src/debug/tserver/_sandbox.py", line 80, in lowerCaseFirst 
ValueError: list.remove(x): x not in list 
+2

Vous ne mentionnez pas l'erreur, mais vous ne pouvez pas modifier une liste en la parcourant.Pourquoi ne pas ajouter les éléments que vous voulez à une nouvelle liste, plutôt que d'essayer de supprimer ceux que vous ne voulez pas de l'ancien? Si vous voulez des commentaires plus généraux, essayez http://codereview.stackexchange.com – jonrsharpe

+0

Est le premier "The" minuscule? – MxyL

Répondre

1

L'erreur dans votre première fonction est parce que Si vous essayez de supprimer une version majuscule de firstWord de newlist où il n'y a pas de mots majuscules (vous voyez cela à partir de l'impression). N'oubliez pas que vous stockez une version supérieure/minuscule de vos mots dans une nouvelle variable, mais vous ne modifiez pas le contenu de la liste d'origine.

Je ne comprends toujours pas votre approche. Vous voulez faire des choses en décrivant votre tâche; 1) Aplatir les listes A de listes à une liste d'éléments (toujours un exercice de programmation intéressant) et 2) supprimer les noms propres de cette liste. Cela signifie que vous devez décider ce qu'est un nom propre. Vous pourriez le faire rudimentarily (tous les mots capitalisés non commençant, ou une liste exhaustive), ou vous pourriez utiliser un tagueur POS (voir: Finding Proper Nouns using NLTK WordNet). À moins que je ne comprenne mal votre tâche, vous n'avez pas à vous soucier du boîtier ici.

La première tâche peut être résolue de plusieurs façons. Voici une belle façon qui illustre bien ce happenes fait dans le simple cas où votre liste L est une liste de listes (et non des listes qui peuvent être infiniment imbriquées):

def flatten(L): 
    newList = [] 
    for sublist in L: 
     for elm in sublist: 
      newList.append(elm) 
    return newList 

cette fonction vous pouvez faire en flattenAndFilter (L) en vérifiant chaque élément comme celui-ci:

PN = [ 'James', 'Bond']

def flattenAndFilter(L): 
    newList = [] 
    for sublist in L: 
     for elm in sublist: 
      if not elm in PN: 
       newList.append(elm) 
    return newList 

vous pourriez ne pas avoir une telle belle liste de PNs, cependant, vous devrez alors étendre sur la vérification, comme par exemple en analysant la phrase et en vérifiant les étiquettes POS.

Questions connexes