J'essaie de manipuler une chaîne.

Après avoir extrait toutes les voyelles d'une chaîne, je veux remplacer tous les «v» par «b» et tous les «b» par «v» de la même chaîne (par exemple, «accveioub» deviendrait d'abord ccvb, puis ccbv).

J'ai du mal à échanger les personnages. Je finis par obtenir ccvv et j'ai pensé que j'obtiendrais cela en fonction de ce code. Je pense à parcourir la chaîne et à utiliser une instruction if qui reste essentiellement si le caractère à l'index i. Est égal à "v" puis le remplacer par "b" et une instruction else qui dit "b" le remplacer par "v" et puis ajoutez ou joignez les personnages ensemble?

Voici mon code

def Problem4():
    volString = {"a", "e", "i", "o", "u", "A", "E", "I", "O", "U"}
    s = "accveioub"
    chars = []
    index = 0

    #Removes all the vowels with the for loop
    for i in s:
        if i not in volString:
            chars.append(i)
    s2 = "".join(chars)
    print(s2)
    print(s2.replace("v", "b"))
    print(s2.replace("b", "v"))

>>> Problem4()
ccvb
ccbb
ccvv
>>> 
5
Usman Bashiru 5 mars 2016 à 08:27

3 réponses

Meilleure réponse

Vous l'avez fait à mi-chemin en fait, la seule chose à noter est que lorsque vous voulez "échanger" le string, vous devez créer un "temporaire" string au lieu de le remplacer directement.

Voici ce que vous avez fait:

ccvb 
ccbb #cannot distinguish between what was changed to b and the original b
ccvv #thus both are changed together

Pensez à utiliser le caractère inexistant dans le string comme premier remplacement. Disons que je change maintenant tout b par 1 d'abord:

s2 = s2.replace("b","1")
s2 = s2.replace("v","b")
s2 = s2.replace("1","v")

Vous obtiendrez alors:

ccvb #original
ccv1 #replace b with 1
ccb1 #replace v with b
ccbv #replace 1 with v

Le point le plus important ici est l'utilisation du string temporaire

3
Ian 5 mars 2016 à 05:59

La compréhension de Python et les expressions génératrices sont assez puissantes.
Vous pouvez supprimer la voyelle en même temps que le join():

>>> volString = {"a", "e", "i", "o", "u", "A", "E", "I", "O", "U"}
>>> s = 'accveioub'
>>> ''.join(c for c in s if c not in volString)
'ccvb'

En fait, vous faites aussi l'échange dans le join() mais cela peut-être un peu trop verbeux:

>>> ''.join('v' if c == 'b' else 'b' if c == 'v' else c for c in s if c not in volString)
'ccbv'

Vous pouvez extraire le code d'échange dans un dict de mappage (dict.get(k, v) renvoie v si k n'est pas dans le dictionnaire):

>>> vbmap = {'b': 'v', 'v': 'b'}
>>> ''.join(vbmap.get(c, c) for c in s if c not in volString)
'ccbv'

L'avantage étant que ces solutions évitent toutes les créations de chaînes intermédiaires.

3
AChampion 5 mars 2016 à 23:58

Vous devez utiliser un remplacement intermédiaire pour obtenir un résultat correct en python:

s2.replace('b',' ')
s2.replace('v','b')
s2.replace(' ','v')

En d'autres termes, les étapes suivent

  1. Remplacer b par '' espace
  2. Remplacez «v» par «b»
  3. Remplacez l'espace '' (qui était votre caractère b) par 'v'

Bonne chance!

-1
Andriy Ivaneyko 5 mars 2016 à 06:12