Bonjour, j'apprends à programmer en Python pour manipuler des bases de données et je ne peux pas faire cette tâche simple. S'il vous plaît, quelqu'un m'aide. J'ai cette liste

CIS=['4998200lp','2159140lp','02546or']

Je veux obtenir ce résultat:

CIS=['4998200lp','2159140lp','2546or']

J'essayais quelque chose comme:

for x in CIS:
    izq= x[:1]
    if izq == 0:
        CIS=[x.replace(x[:1],'') for x in CIS]
    print (CIS)

Je veux juste supprimer le premier élément de chaque chaîne pour la condition izq == 0.

1
mirko 7 mars 2016 à 23:11

4 réponses

Meilleure réponse

Votre description ne correspond pas à votre exemple d'entrée / sortie qui diffère également de votre code.

Sur la base de l'exemple d'entrée / sortie, je soupçonne que ce que vous essayez de faire est de supprimer un seul 0 de début de toute chaîne commençant par 0. Et ce n'est pas trop mal, mais vous ne pouvez pas le faire dans une boucle for sans avoir d'index à attribuer en retour. Pour cela, vous pouvez utiliser enumerate:

for i, x in enumerate(CIS):
    if x.startswith('0'):  # or x[:1] == '0' if you really prefer
        CIS[i] = x[1:]

Alternativement, vous pouvez utiliser une compréhension de liste pour remplacer CIS:

CIS = [x[1:] if x.startswith('0') else x for x in CIS]

Et pour muter sur place (plutôt que de créer un nouveau list), utilisez la même compréhension mais affectez-le à la tranche complète, ce qui le fait se comporter comme la boucle épelée dans le premier exemple:

CIS[:] = [x[1:] if x.startswith('0') else x for x in CIS]

La différence entre les exemples # 1 / # 3 et l'exemple # 2 se produit si CIS a été passé comme argument à une fonction, ou sinon est référencé à plusieurs endroits. En # 1 / # 3, il mute le list en place, donc toutes les références verront les mises à jour, en # 2, il réaffecte CIS, mais en laissant l'original list inchangé; si d'autres références existent, elles n'apparaîtront pas modifiées.

Remarque: Si l'objectif est de supprimer tous les 0 principaux, utilisez alors str.lstrip, par exemple:

CIS = [x.lstrip('0') for x in CIS]

Avec des adaptations similaires pour les autres approches. Vous n'avez même pas besoin de tester la présence de 0 dans ce cas, car lstrip renverra le str non modifié s'il ne commence pas par 0.

1
ShadowRanger 7 mars 2016 à 20:25

En fait, votre boucle contenait une approche très proche d'une solution de travail:

CIS=['4998200lp','2159140lp','02546or']
CIS=[x.replace(x[:1],'') for x in CIS]

Mais cela dépouillerait tous les premiers éléments. Pour les remplacer uniquement s'ils sont '0' (notez que ce n'est pas la même chose que integer: 0), vous devez vous incorporer if ... else ... dans la liste de compréhension:

CIS=['4998200lp','2159140lp','02546or']
CIS=[x.replace(x[:1],'',1) if x[:1] == '0' else x for x in CIS ]

La syntaxe if ... else ... peut être un peu étrange mais essayez de lire le code à haute voix: "Insérez le x remplacé si le premier caractère est un zéro ou sinon insérez x, pour chaque x dans CIS".

Les autres réponses contiennent des approches beaucoup plus sophistiquées mais je voulais juste ajouter cette réponse pour vous donner une idée que vous étiez sur la bonne voie!

Mais c'est généralement une mauvaise idée d'utiliser une liste de compréhension à l'intérieur d'une boucle for si elles itèrent sur la même iterable. Surtout, vous voulez juste l'un d'eux.

0
MSeifert 7 mars 2016 à 20:31

Si vous cherchez simplement à supprimer le premier zéro de chaque chaîne, utilisez le commence par méthode. Ne cherchez pas non plus un entier 0. Recherchez une chaîne «0».

Enfin, vous pouvez simplifier votre implémentation en faisant tout cela dans une compréhension, en créant une nouvelle liste avec vos nouvelles données:

[w[1:] if w.startswith('0') else w for w in CIS]

Les sorties:

['4998200lp', '2159140lp', '2546or']
1
idjaw 7 mars 2016 à 20:16

Essayez simplement de supprimer le premier caractère de chaque élément commençant par 0:

CIS=['4998200lp','2159140lp','02546or']
for i,v in enumerate(CIS):
    if v.startswith('0'):
        CIS[i] = v[1:]

CIS  # ['4998200lp', '2159140lp', '2546or']
0
ᴀʀᴍᴀɴ 7 mars 2016 à 20:23