Wie extrahieren Sie alle OBEREN aus einem string? Python
#input
my_string = 'abcdefgABCDEFGHIJKLMNOP'
wie würde man alle extrahieren Sie die OBERE aus einem string?
#output
my_upper = 'ABCDEFGHIJKLMNOP'
- können Sie uns zeigen, was Sie bisher ausprobiert haben?
- ich fand einen Weg, es zu tun mit einer for-Schleife, aber es scheint nicht zu einem effizienten
- bitte geben Sie es in der Frage; es ist keineswegs offensichtlich, welche Art von Effizienz-Einschränkungen Sie konfrontiert sind
- ich bin noch immer verwendet, um die join-Funktion, aber ich wusste, es würde etwas entlang jenen Linien
- Wenn Sie sagen, "es schien nicht zu effizient", was meinst du? Sie getestet, und es wurde zu langsam? Sie vermuten, gibt es einige quadratische Verhalten irgendwo sein, wenn es linear? Oder...?
- my_upper=" for k in my_string: wenn k.isupper(): my_upper = my_upper + k ist, was ich hatte, aber es muss gehen Sie durch jedes element der Zeichenfolge hinzufügen, um die Zeichenkette. Ich glaube nicht, das war der Schnellste Weg, dies zu tun
- Ich bin mir nicht sicher, warum, ich bekam eine -1 aus dieser Frage, wenn technisch die Kriterien für eine gute Frage, dass würde helfen, eine Menge von Menschen in der die meisten einfache Weise.
- einen Weg gefunden, es zu tun mit einer for-Schleife, aber es scheint nicht zu einem effizienten" siehe meine Antwort für Effizienz-Vergleiche
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit list comprehension:
Generator-Ausdruck:
Kann man es auch mit regulären Ausdrücken:
string.translate(s, Tabelle[, deletechars]) Funktion löschen Sie alle Zeichen aus dem string, die in deletechars, eine Liste von Zeichen. Dann wird die Zeichenfolge übersetzt mit Tisch (wir sind nicht in diesem Fall).
Entfernen Sie nur die Kleinbuchstaben, die Sie brauchen, um passieren string.ascii_lowercase als Liste der Buchstaben gelöscht werden.
Den
table
ist Keiner da, wenn die TabelleNone
nur den Charakter löschen Schritt durchgeführt werden.ascii_nonuppercase
wie, z.B.,''.join(c for c in string.printable if c not in string.ascii_uppercase)
oder nur'0123456789abcdefghijklmnopqrstuvwxyz!"#$%&\'()*+,-./:;<=>?@[\\]^_
{|}~ \t\n\r\x0b\x0c", und verwenden Sie dann die. Wenn Sie benötigen, um mit Unicode, das ist ein non-starter, aber ansonsten geben Joran Beasley ' s timing, die leichte zusätzliche Komplexität könnte es Wert sein.Höherer Ordnung Funktionen die Rettung!
BEARBEITEN: In Fall, dass Sie nicht wissen, was filter ist: filter nimmt eine Funktion und eine iterierbar, und dann wendet die Funktion auf jedes element der iterierbar. Es hält alle Werte true zurück und wirft den rest. Also, das wird wieder "ABCDEFGHIJKLMNOP".
filter(str.isupper,"abvABC")
join
, seit der OP will einen string -, nicht um eine Liste oder einen filter iterator.oder verwenden regex ... das ist eine einfache Antwort
nur zum Vergleich
also diese join-plus findall ist die Schnellste Methode (pro ipython %timeit (python 2.6)) mit 10000 Zeichen lange Zeichenfolge identisch
Bearbeiten: Oder nicht
join
um diese Arbeit zu machen. (Wenn Sie sich absolut sicher sind, dass alle Großbuchstaben werden in einem einzigen Lauf, Sie könnte verwenden[0]
statt, natürlich.)filter
beats von 20%. Die Größenordnung Gewinn vontranslate
ist eher vertrauenswürdig, aber auch, dass die Tropfen zu einem 2:1 gewinnen in einem kurzen test mit PyPy.Könnten Sie einen mehr funktionalen Ansatz
filter(str.isupper,"abvABC")
lambdas verlangsamen Filter verwenden ... gelieferten, wenn du kannst 🙂join
hier. Andernfalls bist du wieder einlist
(2.x) oder einen filter iterator (3.x), nicht einen string.filter
"funktionaler" als ein verstehen/genexp, zumindest ohne Erklärung. Die Sprache Python entlehnt letztere von Haskell ist, nachdem alle.hier gehen Sie: