Comment extraire de la tige à partir d'une chaîne? Python
#input
my_string = 'abcdefgABCDEFGHIJKLMNOP'
comment extraire tout le HAUT à partir d'une chaîne?
#output
my_upper = 'ABCDEFGHIJKLMNOP'
pouvez-vous nous montrer ce que vous avez essayé jusqu'à présent?
j'ai trouvé un moyen de le faire avec une boucle for, mais il ne semble pas efficace
veuillez ne fournir dans la question, c'est loin d'être évident ce genre de contraintes d'efficacité, vous êtes face à
je suis stil de s'habituer à la fonction join mais je savais que ça allait être quelque chose le long de ces lignes
Quand vous dites "il ne semble pas trop efficace", que voulez-vous dire? Vous l'avez testé et il était trop lent? Vous pensez, il y a quelques quadratique comportement quelque part, quand il devrait être linéaire? Ou...?
j'ai trouvé un moyen de le faire avec une boucle for, mais il ne semble pas efficace
veuillez ne fournir dans la question, c'est loin d'être évident ce genre de contraintes d'efficacité, vous êtes face à
je suis stil de s'habituer à la fonction join mais je savais que ça allait être quelque chose le long de ces lignes
Quand vous dites "il ne semble pas trop efficace", que voulez-vous dire? Vous l'avez testé et il était trop lent? Vous pensez, il y a quelques quadratique comportement quelque part, quand il devrait être linéaire? Ou...?
OriginalL'auteur O.rka | 2013-04-08
Vous devez vous connecter pour publier un commentaire.
L'aide de la liste de compréhension:
À l'aide du générateur d'expression:
Vous pouvez également le faire à l'aide d'expressions régulières:
OriginalL'auteur piokuc
chaîne de caractères.traduire(s, tableau[, deletechars]) fonction va supprimer tous les caractères de la chaîne sont en deletechars, une liste de caractères. Ensuite, la chaîne sera traduit à l'aide du tableau (nous ne sommes pas à l'utiliser dans ce cas).
Pour supprimer uniquement les lettres minuscules, vous devez passer chaîne de caractères.ascii_lowercase que la liste des lettres à supprimer.
La
table
n'est parce que quand la table estNone
, seul le personnage de suppression étape sera réalisée.Suppression de tous les minuscules n'est le même que soustrayant tous les majuscules lorsque les données n'en est rien, mais des lettres. L'OP est un échantillon est toutes les lettres, de sorte que le est approprié—mais pas sans expliquer la différence.
c'est de loin la plus efficace du temps de la méthode de toutes les donné ... en supposant que cela fonctionne pour l'OP cas d'utilisation ...
Si vous avez besoin de traiter avec des lettres, mais seulement avec l'ASCII, vous pouvez définir
ascii_nonuppercase
comme, par exemple,''.join(c for c in string.printable if c not in string.ascii_uppercase)
, ou tout simplement'0123456789abcdefghijklmnopqrstuvwxyz!"#$%&\'()*+,-./:;<=>?@[\\]^_
{|}~ \t\n\r\x0b\x0c", et ensuite l'utiliser. Si vous avez besoin de traiter avec Unicode qui est un non-starter, mais sinon, donner Joran Beasley moment, la légère complexité supplémentaire pourrait être en vaut la peine.OriginalL'auteur herinkc
Des fonctions d'ordre supérieur à la rescousse!
MODIFIER: Dans le cas où vous ne savez pas ce filtre: filtre prend une fonction et un objet iterable, et applique ensuite la fonction de chaque élément dans le itératif. Il conserve toutes les valeurs qui renvoient true et jette tout le reste. Donc, ce sera le retour de "ABCDEFGHIJKLMNOP".
filter(str.isupper,"abvABC")
wow, vous avez entièrement raison. Répare.
Celle-ci a également besoin d'un
join
, depuis l'OP veut une chaîne de caractères, pas d'une liste ou d'un filtre itérateur.Cela ne fait retourner une chaîne de caractères.
dépend pyver ...
OriginalL'auteur hatkirby
ou utiliser les regex ... c'est une réponse facile
juste pour comparaison
donc cette jointure plus findall est la méthode la plus rapide (par ipython %timeit (python 2.6)) , à l'aide d'un 10000 caractères chaîne identique
modifier: Ou pas
Vous avez besoin d'ajouter un
join
pour faire ce travail. (Si vous êtes absolument sûr que tous les caractères en majuscules sont en un seul passage, vous pouvez utiliser[0]
au lieu de cela, bien sûr.)corrigé 😛 ... juste de rejoindre la sortie à la fin
Je ne voudrais pas faire de fortes déclarations à propos de l'efficacité basée sur une différence de 10% sans tester plusieurs versions de Python, plates-formes, etc., et les différentes données d'entrée. Par exemple, j'obtiens des résultats similaires avec Disponible 2.7.2, mais sur 3.3.0, le genexp bat la regex de 5%, tandis que PyPy 1.9.0, le
filter
battements de 20%. L'ordre de grandeur de gain detranslate
est plus susceptible d'être digne de confiance, mais même qui descend à 2:1 gain dans un test rapide avec PyPy.OriginalL'auteur Joran Beasley
Vous pouvez utiliser une approche plus fonctionnelle
filter(str.isupper,"abvABC")
lambdas ralentir filtres ... utiliser les builtins si vous pouvez 🙂Vous avez besoin d'un
join
ici. Sinon, vous allez retourner unlist
(2.x) ou un filtre itérateur (3.x), pas une chaîne de caractères.Aussi, c'est un peu trompeur d'appel
filter
"plus fonctionnelle" que d'une compréhension/genexp, au moins, sans explication. Le langage Python emprunté le dernier de est Haskell, après tout.OriginalL'auteur Finn
ici, vous allez:
OriginalL'auteur user9830600