2016-07-30 18 views
0

Der Zweck meines Programms besteht darin, Positionen von Iterationen von Wörtern in einem Satz zu finden, und die fehlerhafte Subroutine geht wie folgt.Abrufen mehrerer wiederholender Positionen von Strings in der Liste

def analyse(splitString): 
wordToSearch = input("What word are you searching for instances of? ").lower() 
for word in splitString: 
    positionLibrary = "" 
    positionInSplitString = 0 
    instances = 0 
    if word == wordToSearch: 
     position = splitString.index(word) 
     positionLibrary += str(position) 
     print (position, word) 
     instances += 1 
    positionInSplitString += 1 
return (positionLibrary, instances, wordToSearch) 

Let „split“ sind die Listenform des Satzes „IST DIE VERÄNDERUNG MOTION HAUPT proportional zur MOTIVE FORCE IMPRESSED und in der rechten Linie geleistet, an dem diese Kraft impressed“. Wenn ich nun in splitString nach "imprinted" suche, gibt es What word are you searching for instances of? impressed 11 impressed 11 impressed ['the', 'alteration', 'of', 'motion', 'is', 'ever', 'proportional', 'to', 'the', 'motive', 'force', 'impressed', 'and', 'is', 'made', 'in', 'the', 'right', 'line', 'on', 'which', 'that', 'force', 'is', 'impressed'] wordToSearch impressed instances 1 positionLibrary 11 zurück, was mir sagt, dass das Programm irgendwie weiß, dass es 2 Instanzen von "imprimed" gibt, zählt aber nicht die Anzahl dieser Variablen in die Variable "instances" unzuverlässig und funktioniert nicht.) positionLibrary, die (als String) eine Aufzeichnung der Positionen der gefundenen Instanzen speichern soll, funktioniert nicht. Ich glaube, das liegt daran, dass das Programm nur die Position des ERSTEN INSTANZS von "beeindruckt" zurückgibt, wie in gezeigt.

Nun, wie würde ich das Programm tatsächlich alle Positionen nach der ersten Instanz eines Wortes zurückgeben und die Variable "Instanzen" arbeiten lassen? Ich habe weit und breit gesucht und keine Lösung gefunden.

Antwort

0

Sie müssen die index()-Methode nicht verwenden, da Sie bereits eine Schleife durch splitString durchlaufen haben. Sie brauchen nur einen Index oder Zähler, der verfolgt, auf welcher Iteration Sie gerade sind. Dafür können Sie enumerate verwenden.

Was dazu:

def analyse(splitString, wordToSearch): 
    positionLibrary = [j for j, word in enumerate(splitString) if word == wordToSearch] 
    instances = len(positionLibrary) 
    return (positionLibrary, instances) 

splitString = ['the', 'alteration', 'of', 'motion', 'is', 'ever', 'proportional', 'to', 'the', 'motive', 'force', 'impressed', 'and', 'is', 'made', 'in', 'the', 'right', 'line', 'on', 'which', 'that', 'force', 'is', 'impressed'] 
print analyse(splitString, 'impressed') 
# ([11, 24], 2) 

Wenn Sie index() verwenden wollen, kann es ein zweites Argument nehmen, die die Position ist, an dem sollten Sie die Suche starten. Zum Beispiel

print splitString.index('impressed') # 11 
print splitString.index('impressed', 0) # 11 
print splitString.index('impressed', 12) # 24 
+0

Empfehlung: Ändern Sie den Namen 'analysieren (split, wordToSearch)' etwas hilfreicher wie 'index_multiple (iterable, value) '. – Kupiakos

+0

@Kupiakos Ich kopiere einfach den Code des OP :-), aber ich stimme dir zu, dass es besser sein könnte. –

0

Wenn Sie versuchen, wie etwa: -

def index_count_search(sentance, search): 
    searchedList = map(lambda x:x[0], filter(lambda (index, value): search == value, enumerate(sentance.split()))) 
    return (",".join(searchedList), len(searchedList), search) 


wordToSearch = input("What word are you searching for instances of? ").lower() 
print analyse("THE ALTERATION OF MOTION IS EVER PROPORTIONAL TO THE MOTIVE FORCE IMPRESSED AND IS MADE IN THE RIGHT LINE ON WHICH THAT FORCE IS IMPRESSED".lower(), wordToSearch)