
In Python können Sie eine neue Liste aus einer Liste von Strings generieren, indem Sie Elemente extrahieren, ersetzen oder transformieren, die bestimmten Bedingungen mit List Comprehensions erfüllen.
Dieser Artikel erläutert kurz die Listenverständnisse und dann das Folgende mit Beispielcode.
- Extrahieren Sie Zeichenfolgen, die eine bestimmte Zeichenfolge enthalten oder nicht enthalten
- Ersetzen Sie eine bestimmte Zeichenfolge in einer Liste
- Extrahieren Sie Zeichenfolgen, die mit einer bestimmten Zeichenfolge beginnen oder nicht beginnen
- Extrahieren Sie Zeichenfolgen, die mit einer bestimmten Zeichenfolge enden oder nicht enden
- Buchstaben in Groß- oder Kleinbuchstaben extrahieren
- Groß- und Kleinschreibung umwandeln
- Buchstaben alphabetisch oder numerisch extrahieren
- Mehrere Bedingungen
- Regulärer Ausdruck (regex)
Weitere Informationen zum Extrahieren und Ersetzen von Zeichenfolgen finden Sie im following Artikel.
Verständnis aufhören
Um aus einer Liste eine neue Liste zu generieren, can SIE Listenverständnisse verwenden, sterben einfach zu schreiben Sind als sterben for-Schleife.
[expression for variable_name in iterable if condition]
Wenn Sie nur Elemente extrahieren möchten, sterben Eine Bedingung erfüllen, Wann immer Sie Sie nicht mit Ausdruck verarbeiten. Verwenden Sie einfach variable_name.
[variable_name for variable_name in iterable if condition]
Wenn Sie die if-Bedingung in if not-Bedingung ändern, können Sie Elemente extrahieren, sterben die Bedingung nicht erfüllen.
Weitere Informationen zum Extrahieren, Ersetzen und Konvertieren von Listenelementen mithilfe von List Comprehensions finden Sie im following Artikel.
specific_string in target_string gibt True zurück, wenn target_string einen specific_string enthält. Verwenden Sie Sie nicht in für die Vereinigung.
l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']
l_in = [s for s in l if 'XXX' in s]
print(l_in)
# ['oneXXXaaa', 'twoXXXbbb']
l_in_not = [s for s in l if 'XXX' not in s]
print(l_in_not)
# ['three999aaa', '000111222']
Ersetzen Sie eine bestimmte Zeichenfolge in einer Liste
If SIE sterben Zeichenfolge von Elementen Einer Liste ersetzen möchten, verwenden SIE sterben Zeichenfolgenmethode replace() für jedes Element mit Listenverständnis.
Wenn es keine zu ersetzende Zeichenfolge gibt, WIRD SIE durch das Anwenden von replace() nicht geändert, sodass SIE kein Element mit der if-Bedingung auswählen müssen.
l_replace = [s.replace('XXX', 'ZZZ') for s in l]
print(l_replace)
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
Um ein ganzes Element zu ersetzen, das eine bestimmte Zeichenfolge enthält, extrahieren Sie es mit in und verwenden Sie Bedingungsausdrücke (ternäre Operatoren), X if condition else Y.
Verwenden Sie bedingte Ausdrücke für den Ausdrucksteil von Listenverständnissen.
l_replace_all = ['ZZZ' if 'XXX' in s else s for s in l]
print(l_replace_all)
# ['ZZZ', 'ZZZ', 'three999aaa', '000111222']
Es ist möglicherweise zu einfacher zu verstehen und Fehler mit Klammern zu vermeiden. Grammatisch spielt es keine Rolle, ob es Klammern gibt oder nicht.
[('ZZZ' if ('XXX' in s) else s) for s in l]
Die String-Methode startedwith() gibt True zurück, wenn der String mit dem bestimmten String beginnt.
l_start = [s for s in l if s.startswith('t')]
print(l_start)
# ['twoXXXbbb', 'three999aaa']
l_start_not = [s for s in l if not s.startswith('t')]
print(l_start_not)
# ['oneXXXaaa', '000111222']
Die Zeichenfolgenmethode „endswith()“ gibt „True“ zurück, wenn die Zeichenfolge mit der bestimmten Zeichenfolge endet.
l_end = [s for s in l if s.endswith('aaa')]
print(l_end)
# ['oneXXXaaa', 'three999aaa']
l_end_not = [s for s in l if not s.endswith('aaa')]
print(l_end_not)
# ['twoXXXbbb', '000111222']
Sie können die String-Methoden isupper(), islower() verwenden, um festzustellen, ob ein String nur in Großbuchstaben oder nur in Kleinbuchstaben geschrieben ist.
l_lower = [s for s in l if s.islower()]
print(l_lower)
# ['three999aaa']
Groß- und Kleinschreibung umwandeln
Wenn Sie alle Buchstaben in Groß- oder Kleinbuchstaben umwandeln möchten, verwenden Sie die String-Methoden upper() oder lower(). Es Werden auch andere Methoden bereitgestellt, wie etwa capitalize(), um den ersten Buchstaben groß zu schreiben, und swapcase(), um Groß- und Kleinschreibung zu vertauschen.
Verwenden Sie Bedingungsausdrücke, um nur sterben Elemente zu konvertieren, sterben sterben Bedingungen erfüllen.
l_upper_all = [s.upper() for s in l]
print(l_upper_all)
# ['ONEXXXAAA', 'TWOXXXBBB', 'THREE999AAA', '000111222']
l_lower_to_upper = [s.upper() if s.islower() else s for s in l]
print(l_lower_to_upper)
# ['oneXXXaaa', 'twoXXXbbb', 'THREE999AAA', '000111222']
Sie können die Zeichenfolgenmethoden isalpha() und isnumeric() verwenden, um festzustellen, ob eine Zeichenfolge ausschließlich alphabetisch oder ausschließlich numerisch ist.
l_isalpha = [s for s in l if s.isalpha()]
print(l_isalpha)
# ['oneXXXaaa', 'twoXXXbbb']
l_isnumeric = [s for s in l if s.isnumeric()]
print(l_isnumeric)
# ['000111222']
Mehrere Bedingungen
Sie können auch mehrere Bedingungen angeben, die Sie und oder im Bedingungsteil der Listenverständnisse verwenden. Sie können auch keine Verneinung verwenden.
Wenn SIE mehr als drei Bedingungen verwenden, ist es sicherer, jede Gruppe mit () einzuschließen, da die Ergebnisse je nach Reihenfolge unterschiedlich sind.
l_multi = [s for s in l if s.isalpha() and not s.startswith('t')]
print(l_multi)
# ['oneXXXaaa']
l_multi_or = [s for s in l if (s.isalpha() and not s.startswith('t')) or ('bbb' in s)]
print(l_multi_or)
# ['oneXXXaaa', 'twoXXXbbb']
Regulärer Ausdruck (regex)
Für eine flexiblere Verarbeitung can SIE Regelmäßige Ausdrücke (Regex) verwenden.
re.match() gibt ein Match-Objekt zurück, wenn es passt, oder None, wenn es nicht passt.
Da Match-Objekte als True und None als False ausgewertet werden, sollten Sie, wenn Sie nur die Elemente extrahieren möchten, die mit einem Regex-Muster übereinstimmen, re.match() auf den Bedingungsteil der Listenverständnisse wie in den bisherigen Beispielen anwenden.
import re
l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']
l_re_match = [s for s in l if re.match('.*XXX.*', s)]
print(l_re_match)
# ['oneXXXaaa', 'twoXXXbbb']
Sie können auch re.sub() verwenden, um den Teil zu ersetzen, der einem Regex-Muster entspricht. Wenn Sie nur übereinstimmende Elemente extrahieren und ersetzen möchten, fügen Sie eine if-Bedingung hinzu.
l_re_sub_all = [re.sub('(.*)XXX(.*)', r'2---1', s) for s in l]
print(l_re_sub_all)
# ['aaa---one', 'bbb---two', 'three999aaa', '000111222']
l_re_sub = [re.sub('(.*)XXX(.*)', r'2---1', s) for s in l if re.match('.*XXX.*', s)]
print(l_re_sub)
# ['aaa---one', 'bbb---two']