J'essaie de créer une fonction qui, une fois passée une lettre et un mot comme argument, renvoie une liste de chaînes avec ce format: «» pour chaque lettre à l'exception de la lettre donnée. Ainsi, une fois passé, "house" et "o" devraient renvoyer ["", "o", "", "", "_"].

Le problème est lorsque la lettre apparaît plus d'une fois.

def char_positioner(word, guessAttempt):
    listedWordBlanks = list(len(word) * '_')

    i = word.index(guessAttempt)

    if guessAttempt in word:
        listedWordBlanks[i] = word[i]


    return listedWordBlanks

C'est ma deuxième tentative mais j'obtiens toujours le même résultat:

word = ['rotten']

wordSpaces = len(word[0]) * '_'
listWordSpaces = list(wordSpaces)


def testPositioner(char):
    
    for space in listWordSpaces:
        if char in word[0]:
            for letter in word[0]:
                listWordSpaces[word[0].index(char)] = char


    return listWordSpaces


testPositioner('t')

Expected result: ['_','_','t','t','_','_',]
**Got:**['_','_','t','_','_','_'] 
0
Nicolas Poletti 16 sept. 2020 à 17:48

3 réponses

Meilleure réponse

Pas besoin d'utiliser index. En fin de compte, vous devrez parcourir toutes les lettres, alors allez simplement avec une simple boucle vérifiant chaque lettre si elle correspond à la lettre cible:

word = "rotten"
res = ['_' for _ in range(len(word))]
target = 't'
for i, letter in enumerate(word):
    if letter == target:
        res[i] = target

À la fin de cela, res sera:

['_', '_', 't', 't', '_', '_']
0
Tomerikoo 16 sept. 2020 à 14:57

La méthode index() des types chaîne renvoie l'index du premier élément trouvé qui correspond au paramètre que vous passez, un caractère dans votre cas. C'est pourquoi il renvoie toujours l'index de la première lettre lorsqu'il s'agit d'une lettre répétée. En utilisant votre logique, je le modifierais comme suit:

if char in listWordSpaces:
    for index, letter in enumerate(word[0]):
        if letter == char:
            listWordSpaces[index] = char

Comme vous pouvez le voir, j'ai utilisé enumerate(), qui renvoie une liste de tuples de deux éléments: l'index et la valeur de chaque élément de l'itérable sur lequel vous itérez. Ensuite, je compare simplement si la lettre du mot est égale au caractère et, si oui, je mets ce caractère à sa place dans votre liste.

0
Shinra tensei 16 sept. 2020 à 14:57

Je vous recommande de ne pas vérifier une seule fois le mot entier. Vérifiez plutôt pour chaque position.

def char_positioner(word, guessAttempt):
    listedWordBlanks = list(len(word) * '_')

    for i, w in enumerate(word):

        if w == guessAttempt:
            listedWordBlanks[i] = w

    return listedWordBlanks

Cela garantira que toutes les occurrences de guessAttempt seront capturées dans listedWordBlanks.

0
Joe Ferndz 16 sept. 2020 à 14:57