2012-04-11 14 views
0

Ich habe eine Bewertung, die erfordert, dass ich Wörter innerhalb einer Liste tausche. Ich habe eine TXT-Datei, die eine Spalte von Wörtern enthält, die die "alten Wörter" sind, und eine Spalte des Wortes, das die "neuen Wörter" sind, gegeben. Ich muss eine Funktion definieren, die die Zeichenfolge überprüft, um zu sehen, ob ein Wort aus der 'alten Wörter' Liste/Spalte in der Zeichenfolge ist, dann muss ich dieses Wort mit dem entsprechenden Wort in der Spalte 'neue Wörter' austauschen .Austauschen von Listenelementen zwischen zwei Listen in Python?

Zum Beispiel:

Erste Reihe, der zwei Spalten von Worten: [ 'Wir 'Du'].

String: „Wir gingen zu einer Hochzeit mit unserer Katze“ Ausgang: ‚Sie mit Ihrer Katze zu einer Hochzeit gingen‘

Die txt angegebene Datei zwei Spalten enthalten ist, und so, nachdem ein Schreiben Bit des Codes, ich habe es geschafft, die Wörter in bestimmte Listen zu teilen, gibt es eine Liste namens "old_word_list", die einzelne Strings aller Wörter, die in der Zeichenfolge enthalten sein/sein können, und eine Liste namens 'new_word_list' enthält, die die enthält Wörter, die verwendet werden, um die alten Wörter zu ersetzen.

Pseudo-Code-Konzept: Wenn Zeichenfolge jedes Wort/s aus old_word_list enthält, ersetzt Wort/s mit den Worten von new_word_list an dem gleichen (entsprechend) Index.

Dies ist der einzige Teil der Beurteilung, die ich feststecke, wenn jemand mir freundlicherweise helfen könnte, das würde sehr geschätzt werden, auch, Kommentar, wenn ich irgendwelche Informationen weggelassen habe. Vielen Dank.

Voll Code:

# Declaring a global variables for the file, so it can be used in the code. 
filename = "reflection.txt" 
the_file = open(filename) 

# Declaring any other reqiured variables. 
word_list = [] 
old_word_list = [] 
new_word_list = [] 

# Creating loop to add all words to a list. 
for line in the_file: 

    # Appends each line to the end of the list declared above. In appending 
    # the lines, the code also removes the last character on each line (/n). 
    word_list.append(line[:-1]) 

# Creating a loop to split each individual word, then appends the 
# old/original words to a declared list, and appends the new words 
# to a declared list. 
for index in range(len(word_list)): 
    temp_word = word_list[index] 
    split_words = temp_word.split() 
    old_word_list.append(split_words[0]) 
    new_word_list.append(split_words[1]) 

# Defining a function to produce altered statement. 
def reflect_statement(statement): 

    # Swaps the old word with the new word. 
    for i in range(len(old_word_list)): 
     if old_word_list[i] in statement: 
      statement.replace(old_word_list[i], new_word_list[i]) 

    # Replaces '.' and '!' with '?'  
    for index in range(list_length): 
     if old_word_list[index] in statement: 
      statment = statement.replace(old_word_list[index], \ 
             new_word_list[index]) 

    statement = statement.replace(".", "?") 
    statement = statement.replace("!", "?") 

    # Returns result statement. 
    return statement. 
+1

Sie Codebeispiele – jdi

+0

-1 korrekt, Codebeispiel – Simon

Antwort

0

Ich werde einige Annahmen sagen, ich meine Antwort gemacht habe vor der Veröffentlichung so bitte korrigieren Sie mich, wenn einer dieser falsch sind.

Annahme 1: Es gibt die gleiche Anzahl von Wörtern in jeder Spalte Annahme 2: Gibt es ein und nur ein ‚Partner‘ für jedes Wort, so dass ein Wortpaar

Wenn das der Fall, zu sein, würde ich mache jedes Wortpaar zu einer eigenen Liste. Um den Pseudo-Code für jede Textzeile fortzusetzen, überprüfen Sie jedes Wortpaar und ersetzen Sie das Wort [0] durch das Wort [1].

BEARBEITEN Entschuldigung, nur entdeckt habe ich das mehrdeutig formuliert. Wenn ich die Wortpaarlisten mache, würde ich diese auch in einer Liste speichern, zum Beispiel [["old1", "new1"], ["old2", "new2"]], dann führe deine Schleifen aus, um sie zu ersetzen (ich gebe gerade keinen Beispielcode, weil ich bewusst bin, dass du eine Aufgabe machst, also wahrscheinlich um das Problem zu lösen, aber lassen Sie mich wissen, wenn Sie kämpfen).rechts

+0

für Abwesenheit Beide diese Annahmen sind leider weggelassen für sie nicht besagt. Und dein Pseudo-Code macht durchaus Sinn. Jetzt muss ich nur sehen, ob ich den tatsächlichen Code schreiben kann XD – user1321578

+0

Ich danke Ihnen für Ihre Hilfe. Ich bin nicht einmal in meinem ersten Jahr Uni, ich mache einen frühen Start für Uni, wo ich nur ein erstes Jahr Thema mache. So blank mit mir :) Ich weiß nicht wirklich, wie man den Code schreibt, der sie in Paarlisten bringt. Siehe den EDIT, den ich zu der Frage gemacht habe, unten ist der Code, der die Strings teilt, dass es eine Liste für die alten Wörter und eine Liste für die neuen Wörter gibt. Ich weiß, dass ich das bearbeiten muss, um die Paarliste zu machen, aber ich weiß nicht wie? Vielen Dank! – user1321578

+0

Ich formatierte erfolgreich die Zeichenfolgen wie folgt: '[[" old1 "," new1 "], [" old2 "," new2 "]]' Aber ich bin nicht sicher, wie man den Wiedereinbauteil tut, als nichts, das ich versuche, funktioniert . – user1321578

0

wenn ich Sie zu verstehen, kann dies, aber es ist nicht schön:

for i in range(len(old_word_list)) 
    if old_word_list[i] in "some string": 
     "some string".replace(old_word_list[i], new_word_list[i]) 
+0

Das sieht fast aus, was ich brauche, obwohl es, wenn ich es in meine Funktion einfüge, nicht funktioniert, es gibt keinen Fehler, es tauscht die Wörter einfach nicht aus. Dies ist, was der Code wie folgt aussieht: def reflect_statement (Erklärung): für den Index in range (len (old_word_list)): wenn old_word_list [index] in der Aussage: old_word_list [index] = new_word_list [index] – user1321578

+0

Wenn eines der Elemente in old_word_list [i] keine Zeichenfolge ist, benötigen Sie möglicherweise: if str (old_word_list [i]) in "einige Zeichenfolge": Aber wenn Sie keinen Fehler erhalten, nehme ich keine der Elemente an der Liste stimmen mit der Zeichenkette überein (Groß-/Kleinschreibung nicht?) – cptPH

+0

Es gibt keine Wiederholungen in den Zeichenketten für die gesamte Textdatei. Und da es Testfälle gibt, zeigt es mir, dass 0 von 18 ausgegangen ist. Leider funktioniert es einfach nicht, ich habe keine Ahnung. – user1321578

1

Hinweise:

  1. "string string".split() # auf Leerzeichen in eine Liste einen String Split
  2. Sie können eine for-Schleife verwenden, um eine Liste zu durchlaufen
  3. Listen haben eine myList.index(element), um Ihnen mitzuteilen, ob ein Element in der Liste ist und seinen Index zurückgibt.
  4. Die Indizes werden zwischen Ihren beiden Listen übereinstimmen (nach Ihrer Beschreibung)
  5. Strings haben auch eine "myString.replace (alt, neu)" Methode, falls Sie diese Route gehen möchten.
0
# map old to new words (assuming there are no duplicates) 
replacement_mapping = dict(zip(old_word_list, new_word_list)) 

# go through each word of the string, if it's in the mapping, use replacement, otherwise the word from the string 
new_string = ' '.join([replacement_mapping.get(word, word) for word in given_string.split(' ')]) 
+0

1) Beachten Sie, dass dies eine Hausaufgabenfrage ist; 2) Das muss zu weit fortgeschritten sein für das, was er tut, da bin ich mir sicher. – jdi

+0

Wie @jdi sagte. Ich denke, das ist zu fortgeschritten für das, was ich mache. Als ich bin ein Jahr 12 Student, der einen frühen Anfang an einer Universität für ein grundlegendes erstes Jahr-Thema macht. Also ich danke Ihnen für Ihre Eingabe, und obwohl dies wahrscheinlich funktioniert, wenn richtig eingebaut, kann ich es nicht ganz verstehen. Danke – user1321578

+0

Richtig, ich habe das Hausaufgaben-Tag verpasst ... So viel Glück! Ich hoffe, das wird dir nicht lange ein Rätsel bleiben. –

3

können Sie diesen Code verwenden:

# the words to be replaced 
old_word_list=['We','cat'] 

# the new words 
new_word_list=['You','dog'] 

my_string="We went to a wedding with our cat" 

# it prints "We went to a wedding with our cat" 
print my_string 

# iterate over the list of old words 
for word in old_word_list: 
    # get the index of the current word 
    index = old_word_list.index(word) 

    # use this index to do the replacement with the words of the two lists 
    my_string = my_string.replace(old_word_list[index], new_word_list[index]) 

# it prints "You went to a wedding with our dog" 
print my_string 

aktualisiert Antwort nach Autors Kommentare:

# the words to be replaced 
old_word_list=['We','cat'] 

# the new words 
new_word_list=['You','dog'] 

def reflect_statement(statement): 
    # iterate over the list of old words 
    for word in old_word_list: 
    # get the index of the current word 
    index = old_word_list.index(word) 

    # use this index to do the replacement with the words of the two lists 
    statement = statement.replace(old_word_list[index], new_word_list[index]) 

    return statement 

mystring="We went to a wedding with our cat" 
mystring = reflect_statement(mystring) 
print mystring 

aktualisiert Antwort nach der zuletzt hinzugefügten Quellcode nach Autor:

Ihre Funktion wie diese ändern:

def reflect_statement(statement, old_word_list, new_word_list): 
    mystr=statement 
    # iterate over the list of old words 
    for word in old_word_list: 
    # get the index of the current word 
    index = old_word_list.index(word) 

    # use this index to do the replacement with the words of the two lists 
    mystr = mystr.replace(old_word_list[index], new_word_list[index]) 

    return mystr 
+0

Das ist so nah! Ich denke ... Da dieser Code in einer Funktion sein muss, weil er Testfälle verwendet, habe ich (möglicherweise falsch) Ihren Code geändert, so dass es funktionieren sollte. Ich habe die ersten vier Zeilen Ihres Codes gelöscht, da er nicht benötigt wird. Und ich habe ändern, wo Sie sehen "My_string" zu "Anweisung" Weil meine Funktion ist 'def reflect_statement (Anweisung):' Ich bekomme diesen Fehler: Anweisung = statement.replace (old_word_list [Index], new_word_list [index]) IndexError: Listenindex außerhalb des Bereichs Irgendwelche Ideen? Danke – user1321578

+0

wahrscheinlich sind die Schlepplisten, die Sie für das Mapping verwenden, nicht von der gleichen Länge. Stellen Sie sicher, dass old_word_list und new_word_list die gleiche Anzahl von Elementen (Strings) haben. –

+0

Ok. Ich habe es NICHT mir einen Fehler geben, obwohl dieses Mal es nicht funktioniert, sie tauschen nicht. Ideen? – user1321578

Verwandte Themen