Seite 1 von 1

newbiehaftes Listenproblem

Verfasst: Dienstag 11. März 2008, 14:35
von Gisi
Hi,

stehe grade ziemlich auf dem Schlauch. Hier erst mal mein Code:

Code: Alles auswählen

nerList=[['London','Location'],['United Kingdom', 'Location'],['London','Institution']]

posList=[[1, 'bla', 1, 3], [1, 'London', 5, 10], [1, 'is', 12, 13],
         [1, 'a', 15, 15], [1, 'nice', 17, 20], [1, 'city', 22, 25],
         [1, 'it', 28, 29], [1, 'is', 31, 32], [1, 'the', 34, 36],
         [1, 'capital', 38, 44], [1, 'of', 46, 47], [1, 'the', 49, 51],
         [1, 'United', 53, 58], [1, 'Kingdom', 60, 66], [1, 'and', 68, 70],
         [1, 'much', 72, 75], [1, 'appreciated', 77, 87], [1, 'by', 89, 90],
         [1, 'Jack', 92, 95], [1, 'London', 97, 102], [2, 'bla', 1, 3]]

def getList(posList, nerList):
    output=[]
    for word in nerList:
        entity=word[0]
        name=word[1]
        for item in posList:
            sentNr=item[0]
            wo=item[1]
            startpos=item[2]
            endpos=item[3]
            if wo==entity:
                output.append([sentNr, entity, name, startpos, endpos])
            elif wo!=entity:
                try:
                    nextWord=posList[posList.index(item)+1][1]
                except IndexError:
                    nextWord=''
                if nextWord!='':
                    exp='%s %s'%(wo, nextWord)
                    if entity==exp:
                        endpos=posList[posList.index(item)+1][3]
                        output.append([sentNr, entity, name, startpos, endpos])
    return output
Das gibt mir nun Folgendes:
  • [[1, 'London', 'Location', 5, 10], [1, 'London', 'Location', 97, 102], [1, 'United Kingdom', 'Location', 53, 66], [1, 'London', 'Institution', 5, 10], [1, 'London', 'Institution', 97, 102]]
Ich möchte aber das:
  • [[1, 'London', 'Location', 5, 10], [1, 'United Kingdom', 'Location', 53, 66], [1, 'London', 'Institution', 97, 102]]
Mein Plan: Ich will erstes Gefundenes an output hängen und dann gleich die zugehörige Liste aus posList löschen. Und, genau hier, ist der Schlauch.

Vielen Dank für jede Hilfe...

Verfasst: Dienstag 11. März 2008, 15:10
von BlackJack
Das hat mindestens eine Laufzeitkomplexität von O(n²). ``posList.index(item)`` ist auch keine gute Idee, da wird die Liste wieder von vorne durchsucht, nach einem `item` das wir schon längst haben, und wo man sich mit `enumerate()` gleich den Index hätte mit liefern lassen können.

Die Variablennamen sind nicht so toll. Die `List`-Suffixe weglassen und statt der Zwei-bis-Drei-Buchstaben-Kürzel aussagekräftigere Namen wäre nicht schlecht.

Ansonsten ist mir der Code ein bisschen zu wirr um heraus zu finden wie man von den Ausgangsdaten auf das Wunschergebnis kommen soll.

Aus Datenstrukturen löschen zu wollen während man darüber iteriert, ist keine gute Idee. Das gibt in den meisten Fällen Chaos.