Dans ma mission, je dois convertir un nombre en lettre à l'aide d'une liste. J'ai pu le faire, sauf que je suis coincé sur la question des bonus. Lorsque l'entrée est laissée vide, l'index doit se référer à [2]. J'ai essayé d'ajouter une instruction elif, mais je continue d'obtenir le premier index, quoi que je fasse. Le cours n'a pas couvert d'informations sur la gestion des entrées vides. Mon code est le suivant:

phone_letters = [' ', '','ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ']
letter = input('Enter a single letter, space or empty: ')

def let_to_num(letter):
    key = 0
    while key < 10:
        if letter.upper() in phone_letters[key]:
            return key
        elif letter == False: #don't know how to deal with a blank input
            key = 1
        else:
            key = key + 1           
    return "Not Found"

print(letter,"=",let_to_num(letter))
1
teveji 18 avril 2020 à 10:40

3 réponses

Meilleure réponse

L'entrée n'est pas votre problème, c'est la façon dont vous vérifiez. Vous voudrez probablement placer un cas spécial de vérification de votre entrée "" au début de la fonction.

Le problème est que vous voyez si la lettre se trouve dans les valeurs de phone_letters, mais une chaîne vide correspondra toujours à ce test. Votre chèque le recherche donc dans key = 0 et le "trouve".

>>> "x" in "foobar"  # not present
False
>>> "" in "foobar"   # empty string always present
True

Vous devez donc vérifier l'entrée == "" tôt et gérer cela. Ensuite, faites votre boucle (ou autre).

if letter == "":
    return 2
.....

Notez que c'est une excellente utilisation pour un dictionnaire. Si vous créez un dictionnaire avec le nombre de chacune des lettres souhaitées, il est facile de le rechercher et de renvoyer cette valeur. Il gère également la chaîne vide sans cas particulier.

>>> let_to_num = {"": 2,
... " ": 1,
... "A":3,
... "B":3,
... "C":3,
... "D":4}
>>> let_to_num.get("", "Not Found")  # empty string
2
>>> let_to_num.get(" ", "Not Found")  # space
1
>>> let_to_num.get("D", "Not Found")  # regular letter
4
>>> let_to_num.get("$", "Not Found")  # invalid letter
'Not Found'
3
komeil majidi 18 avril 2020 à 07:55

Une entrée vide est "" et une entrée avec un espace est " ", cependant, alors qu'une chaîne vide est évaluée à False, un espace est évalué à True. La façon dont je gérerais le code ci-dessus est la suivante.

phone_letters = [' ', '','ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ']
letter = input('Enter a single letter, space or empty: ')

def let_to_num(letter):

    if letter == "": # Make sure it's not an empty string
        return letter

    for index, item in enumerate(phone_letters): # loop over each item in letters
        if letter.upper() in item: # String comp
            return index

    return "Not Found" # Default return if still here
2
TheLazyScripter 18 avril 2020 à 08:01

Même si les chaînes vides sont "fausses", la comparaison suivante ne fonctionnera pas:

'' == False  # False

Au lieu de cela, vous pouvez utiliser l'opérateur logique not:

not ''  # True

Donc, dans votre code, vous pouvez utiliser

def let_to_num(letter):
    if not letter:
        return 1
    key = 0
    while key < 10:
        if letter.upper() in phone_letters[key]:
            return key
        else:
            key = key + 1           
    return "Not Found"

Et vous pouvez également supprimer l'entrée correspondant à une chaîne vide dans votre liste. Pour finir, notez que '' in my_string sera évalué à True pour n'importe quelle chaîne.


Si vous souhaitez améliorer davantage votre code, vous pouvez consulter les Dictionaries ou la fonction enumerate() intégrée.

3
Erik André 18 avril 2020 à 08:17