1
votes

Lutter contre les dictionnaires

J'apprécierais que quelqu'un puisse m'aider à résoudre l'exercice suivant.

Ecrire une fonction qui prend une chaîne contenant des mots séparés par des espaces et crée un dictionnaire où les clés correspondent aux derniers caractères des mots de la chaîne , tandis que les valeurs associées correspondent aux listes dont les mots se terminent par ce caractère.

De plus, les listes doivent être triées lexicographiquement

Example

def dictionary (string):

    mydict = {}
    mylist = string.split()
    mylist2 = []

    for word in mylist:

        mylist2.append(word[-1])
        mydict = dict((el,(word[-1] for word[-1] in mylist)) for el in mylist2)

    return mydict

Doit renvoyer le dictionnaire suivant

{'s':['This'], 'l':['will'], 'e':['be', 'experience'], 'n':['an'], 'g':['amazing']}

J'ai une idée de la façon dont l'exercice devrait être résolu. Cependant, étant donné que je suis encore un débutant en Python, j'ai du mal.

La première chose que j'ai faite a été de créer un dictionnaire vide. Deuxièmement, j'ai converti la chaîne de mots en une liste en utilisant la méthode split . Ensuite, j'ai créé une autre liste qui prend le dernier caractère des mots de la première liste de chaînes et le met dans la nouvelle liste.

J'ai utilisé dict pour mettre le éléments de la deuxième liste comme clés dans mon dictionnaire qui fonctionne assez bien. Le problème est que je ne peux pas mettre la liste des mots correspondants comme valeurs.

Voici mon code:

string = "This will be an amazing experience"


0 commentaires

4 Réponses :


1
votes

Vous n'avez pas besoin de deux listes, l'algorithme est assez simple:

  1. initialiser un dict vide
  2. diviser la phrase en mots
  3. parcourez les mots en boucle
  4. récupère le dernier caractère du mot, c'est la clé du dict
  5. vérifier si cette clé existe déjà dans le dict, et sinon, l'initialiser avec une liste vide
  6. ajouter le mot à ladite liste
result = {}

for word in string.split():
    key = word[-1]

    if key not in result:
        result[key] = []

    result[key].append(word)

Il existe des moyens de raccourcir cela en utilisant dict.setdefault ou defaultdict , mais c'est l'idée de base.


0 commentaires

1
votes

Vous pouvez utiliser un collections.defaultdict pour créer un dictionnaire avec une liste vide avec une valeur par défaut. Ensuite, en parcourant la liste de mots, vous pouvez extraire le dernier caractère comme clé et ajouter le mot à la liste de valeurs pour cette clé

{'s': ['This'], 'l': ['will'], 'e': ['be', 'experience'], 'n': ['an'], 'g': ['amazing']}

La sortie sera

import collections

def dictionary(string):

    #Dictionary with default value as empty list
    mydict = collections.defaultdict(list)

    #Iterate over list of words
    for word in string.split():

        #Take last character and add word to the value list for that character
        last_char = word[-1]
        mydict[last_char].append(word)

    return dict(mydict)

print(dictionary("This will be an amazing experience"))


0 commentaires

0
votes
st = "This will be an amazing experience"
def func(st):
    d={}
    for v in st.split(' '):
        if v[-1] in d:
            d[v[-1]].append(v)
        else:
            d[v[-1]]=[v]
    return d
print(func(st))

1 commentaires

Pourriez-vous s'il vous plaît ajouter des informations textuelles? Comment votre extrait de code aide-t-il exactement à résoudre le problème?



1
votes

Pour la partie tri lexicographique, vous devrez vous rappeler de trier les listes une fois que vous les avez générés:

my_string = "This will be an amazing experience"

def make_dict(string):
    my_dict = {}
    for word in string.split():
        my_dict.setdefault(word[-1], []).append(word)
    for l in my_dict.values():
        l.sort()
    return my_dict

print(make_dict(my_string))

Une autre possibilité est de créer des tas, plutôt que des listes, puis rapidement générer des listes triées à partir de ces tas. En fonction de votre cas d'utilisation exact, votre le kilométrage peut varier.


4 commentaires

Cela m'a vraiment aidé. Y a-t-il un livre ou un site Web que vous recommanderiez de lire pour apprendre tout cela? Merci beaucoup


Salut @ alex108. De rien! J'ai personnellement appris Python simplement en faisant beaucoup de projets et en recherchant des problèmes sur Google, je devais trouver des réponses à StackOverflow :). Souvent, si vous avez une question, quelqu'un d'autre l'aura déjà posée - parfois il faut un peu de recherche pour l'obtenir, mais cela deviendra plus facile à mesure que vous vous améliorerez en langage Python.


Je pense que je gagnerais vraiment à lire toute la documentation officielle de Python, qu'en pensez-vous? Combien de temps vous a-t-il fallu pour maîtriser Python? Juste curieux.


@ alex108, je dirais quelques mois - même si je ne pense pas que j'arrêterai jamais d'apprendre de nouvelles choses sur Python (et la programmation en général!). La documentation officielle est une excellente ressource. Je vous recommande vivement de lire les parties explicatives des pages telles que la documentation du module re si vous vous trouvez en utilisant re , mais je ne sais pas combien vous allez gagner à simplement tout lire en une seule fois - personnellement, j'apprends toujours mieux en comprenant les choses que j'ai besoin de les appliquer.