Entfernen von beleidigenden Zeichen aus Strings in der Liste

Diese Frage hat hier schon eine Antwort:

  • Entfernen Sie bestimmte Zeichen aus einer Zeichenfolge in python 18 Antworten

Beispieldaten zum Parsen (eine Liste von Unicode-Strings):

[u'\n', u'1\xa0', u'Some text here.', u'\n', u'1\xa0', u'Some more text here.', u'\n', u'1\xa0', u'Some more text here.'] 

Ich möchte \xa0 aus diesen Strings entfernen.

EDIT: Aktuelle Methode funktioniert nicht:

 def remove_from_list(l, x): return [li.replace(x, '') for li in l] remove_from_list(list, u'\xa0') 

Ich bekomme immer genau die gleiche Ausgabe.

3 Solutions collect form web for “Entfernen von beleidigenden Zeichen aus Strings in der Liste”

Das Problem unterscheidet sich in jeder Version Ihres Codes. Beginnen wir damit:

 newli = re.sub(x, '', li) l[li].replace(newli) 

Zuerst ist newli schon die Linie, die du willst – das ist was re.sub tut – also brauchst du hier gar nicht zu replace . newli einfach newli .

Zweitens wird ich nicht arbeiten, denn li ist der Wert der Linie, nicht der Index .


In dieser Version ist es ein bisschen subtiler:

 li = re.sub(x, '', li) 

re.sub gibt einen neuen String zurück und du ordnet diesen String zu li . Aber das beeinträchtigt nichts in der Liste, es sagt nur " li bezieht sich nicht mehr auf die aktuelle Zeile in der Liste, sondern bezieht sich jetzt auf diese neue Zeichenfolge".


Um nur zu ersetzen, die Liste Elemente ist, um den Index zu erhalten, so können Sie die [] Operator verwenden. Und um das zu bekommen, willst du enumerate .

Damit:

 def remove_from_list(l, x): for index, li in enumerate(l): l[index] = re.sub(x, '', li) return l 

Aber wirklich, du möchtest vermutlich str.replace – es ist nur so, dass du es anstelle von re.sub :

 def remove_from_list(l, x): for index, li in enumerate(l): l[index] = li.replace(x, '') return l 

Dann musst du dich nicht darum kümmern, was passiert, wenn x ein besonderer Charakter in regulären Ausdrücken ist.


Auch in Python, du willst fast nie ein Objekt an Ort und Stelle ändern und es auch zurückgeben. Entweder ändern und zurückgeben oder keine neue Kopie des Objekts zurückgeben. Also entweder:

 def remove_from_list(l, x): for index, li in enumerate(l): newli = li.replace(x, '') l[index] = newli 

… oder:

 def remove_from_list(l, x): new_list = [] for li in l: newli = li.replace(x, '') new_list.append(newli) return new_list 

Und man kann einfach das letztere zu einem Listenverständnis, wie in der Antwort von unutbu:

 def remove_from_list(l, x): new_list = [li.replace(x, '') for li in l] return new_list 

Die Tatsache, dass die zweite ist einfacher zu schreiben (keine Notwendigkeit für enumerate , hat eine praktische Verknüpfung, etc.) ist kein Zufall – es ist in der Regel die, die Sie wollen, so Python macht es einfach.


Ich weiß nicht, wie sonst das klarer zu machen ist, aber ein letzter Versuch:

Wenn Sie die Version auswählen, die eine feste neue Kopie der Liste zurückgibt, anstatt die Liste an Ort und Stelle zu ändern, wird Ihre ursprüngliche Liste nicht in irgendeiner Weise geändert. Wenn du die neue Kopie verwenden möchtest, musst du den Rückgabewert der Funktion verwenden. Beispielsweise:

 >>> def remove_from_list(l, x): ... new_list = [li.replace(x, '') for li in l] ... return new_list >>> a = [u'\n', u'1\xa0'] >>> b = remove_from_list(a, u'\xa0') >>> a [u'\n', u'1\xa0'] >>> b [u'\n', u'1'] 

Das Problem, das du mit deinem tatsächlichen Code hast, das alles in eine Liste von 1-Zeichen- und 0-Zeichen-Zeichenfolgen verwandelt, ist, dass du eigentlich nicht eine Liste von Strings in erster Linie hast, du hast einen String, der ein repr Liste der Saiten Also, for li in l bedeutet "für jeden Charakter li in der Zeichenkette l , anstatt for each string li in the list l".

Eine weitere Option, wenn Sie nur an ASCII-Zeichen interessiert sind (wie Sie characters erwähnen, aber dies auch auch für den Fall des gebuchten Beispiels zu arbeiten):

 [text.encode('ascii', 'ignore') for text in your_list] 

Du könntest ein Listenverständnis und Str.replace verwenden :

 >>> items [u'\n', u'1\xa0', u'Some text here.', u'\n', u'1\xa0', u'Some more text here.', u'\n', u'1\xa0', u'Some more text here.'] >>> [item.replace(u'\xa0', u'') for item in items] [u'\n', u'1', u'Some text here.', u'\n', u'1', u'Some more text here.', u'\n', u'1', u'Some more text here.'] 
  • Listenindex außerhalb des Bereichs beim Zugriff auf die Zeile aus der CSV-Datei lesen
  • Gurobi Ziel mit Python Wörterbuch Werte
  • Kann die JSON-Datei nicht analysieren, immer ValueError: Extra Data
  • .pyw und pythonw läuft nicht unter Windows 7
  • Tkinter-Indexierung Worte Problem
  • Was ist pyximport und wie soll ich es benutzen?
  • Warum ist die frühere Rückkehr langsamer als sonst?
  • Matlab-Skript nicht gefunden von django views.py
  • Kodierung in networkx
  • Kann das Bild nicht mit tkinter verkleinern
  • Wie bekomme ich die subtrees von dendrogramm von scipy.cluster.hierarchy gemacht
  • Python ist die beste Programmiersprache der Welt.