Existe-t-il un moyen de sous-chaîne d'une chaîne en Python, pour obtenir une nouvelle chaîne du troisième caractère à la fin de la chaîne?
Peut-être comme myString[2:end]
?
Si quitter la deuxième partie signifie «jusqu'à la fin», et si vous quittez la première partie, cela commence-t-il depuis le début?
Réponses:
Python appelle ce concept "slicing" et il fonctionne sur plus que des chaînes. Jetez un œil ici pour une introduction complète.
la source
Juste pour être complet car personne d'autre ne l'a mentionné. Le troisième paramètre d'une tranche de tableau est une étape. Donc, inverser une chaîne est aussi simple que:
Ou sélectionner des caractères alternatifs serait:
La possibilité d'avancer et de reculer dans la chaîne maintient la cohérence avec la possibilité de créer une tranche de tableau depuis le début ou la fin.
la source
Substr () fonctionne normalement (ie PHP et Perl) de cette façon:
Les paramètres sont donc
beginning
etLENGTH
.Mais le comportement de Python est différent; il attend le début et un après la FIN (!). C'est difficile à repérer par les débutants. Donc, le remplacement correct pour Substr (s, début, LONGUEUR) est
la source
s[beginning:][:length]
Un moyen courant d'y parvenir est de couper les chaînes.
MyString[a:b]
vous donne une sous-chaîne de l'index a à (b - 1).la source
Un exemple semble manquer ici: copie complète (peu profonde).
C'est un idiome commun pour créer une copie des types de séquence (pas de chaînes internées),
[:]
. Shallow copie une liste, voir Syntaxe de tranche de liste Python utilisée sans raison évidente .la source
a=b
devrait être suffisant.[:]
sur un type immuable ne fait pas du tout de copie. Bien quemysequence[:]
est la plupart du temps inoffensifs quandmysequence
est un type immuable commestr
,tuple
,bytes
(AP3) ouunicode
(AP2),a = b[:]
est équivalent àa = b
, il gaspille un peu de temps l' envoi des codes d'octets de découpage qui les répond objet par lui - même de retour , car il est inutile de copie peu profonde quand , à part les tests d'identité d'objet, cela revient à simplement renvoyer une autre référence à son soi immuable.s[:]
ne fait pas une copie du tout:s = 'abc'; s0 = s[:]; assert s is s0
. Oui, c'était la façon idiomatique de copier une liste en Python jusqu'à ce que les listes soient obtenueslist.copy
, mais une tranche complète d'un type immuable n'a aucune raison de faire une copie car elle ne peut pas être modifiée, il peut donc aussi bien y en avoir qu'une seule en mémoire et nous ne devrions pas perdre de temps à le copier. Puisque cette réponse est fausse et ne répond même pas à la question - devrait-elle être supprimée?Oui, cela fonctionne en fait , si vous attribuez, ou se lier , le nom,
end
à singleton constante,None
:La notation de tranche a 3 arguments importants:
Leurs valeurs par défaut lorsqu'elles ne sont pas données sont
None
- mais nous pouvons les transmettre explicitement:Oui, par exemple:
Notez que nous incluons start dans la tranche, mais nous n'allons que jusqu'à, et non compris, stop.
Lorsque l'étape est
None
, par défaut, la tranche utilise1
pour l'étape. Si vous marchez avec un entier négatif, Python est assez intelligent pour aller de la fin au début.J'explique la notation de tranche en détail dans ma réponse à la question Expliquer la notation de tranche.
la source
Vous l'avez ici, sauf pour "end". C'est ce qu'on appelle la notation de tranche. Votre exemple devrait se lire:
Si vous omettez le deuxième paramètre, il s'agit implicitement de la fin de la chaîne.
la source
Je voudrais ajouter deux points à la discussion:
Vous pouvez utiliser à la
None
place sur un espace vide pour spécifier "du début" ou "jusqu'à la fin":Ceci est particulièrement utile dans les fonctions, où vous ne pouvez pas fournir un espace vide comme argument:
Python a des objets slice :
la source
Si myString contient un numéro de compte qui commence à l' offset 6 et 9 a une longueur, vous pouvez extraire le numéro de compte de cette façon:
acct = myString[6:][:9]
.Si le PO accepte cela, il pourrait vouloir essayer, de manière expérimentale,
Cela fonctionne - aucune erreur n'est déclenchée et aucun «remplissage de chaîne» par défaut ne se produit.
la source
myString[offset:][:length]
dans le cas de l'OP, vous pouvez simplement utilisermyString[offset:][:]
Je l'ai peut-être manqué, mais je n'ai pas trouvé de réponse complète sur cette page aux questions d'origine car les variables ne sont pas discutées plus en détail ici. J'ai donc dû continuer à chercher.
Comme je ne suis pas encore autorisé à commenter, permettez-moi d'ajouter ma conclusion ici. Je suis sûr que je n'étais pas le seul intéressé à y accéder en accédant à cette page:
Si vous quittez la première partie, vous obtenez
Et si vous avez laissé le: au milieu également, vous avez la sous-chaîne la plus simple, qui serait le 5ème caractère (comptez en commençant par 0, c'est donc le blanc dans ce cas):
la source
Eh bien, j'ai eu une situation où je devais traduire un script PHP en Python, et il avait de nombreuses utilisations de
substr(string, beginning, LENGTH)
.Si je choisissais Python,
string[beginning:end]
je devrais calculer beaucoup d'index de fin, donc la façon la plus simple était d'utiliserstring[beginning:][:length]
, cela m'a sauvé beaucoup de problèmes.la source
L'utilisation d'index codés en dur peut être un gâchis.
Afin d'éviter cela, Python propose un objet intégré
slice()
.Si nous voulons savoir combien d'argent il me reste.
Solution normale:
Utilisation de tranches:
En utilisant la tranche, vous gagnez en lisibilité.
la source