UPD: insertion à
from collections import OrderedDict
dans l'une de mes cellules de code a aidéJe veux créer un programme qui accepte une chaîne, puis génère un dictionnaire où chaque élément est le caractère de cette chaîne avec un index.
Entrée:
hello
Sortie
{'h': 1, 'e': 2, 'l': 3, 'l': 4, 'o': 5}
J'ai trouvé plusieurs façons de créer ce type de dictionnaire. Cependant, dans tous les cas, j'ai la sortie suivante avec l'entrée mentionnée ci-dessus:
{'e': 2, 'h': 1, 'l': 4, 'o': 5}
#solution 1 s = str(input()) dic = {} for index, symb in enumerate(s, 1): dic[symb]=index dic #soultion 2 s = input() d4 = {} d4 = dict(zip(s,range(1,len(s)+1))) d4Quel peut être un problème ici? J'apprécierai toute aide. Merci d'avance.
PS pour le codage J'utilise Google Collab
3 Réponses :
Les dictionnaires n'autorisent qu'une seule valeur par clé, il n'y aura donc pas deux valeurs pour la clé l
, peu importe vos efforts. De plus, les dictionnaires ne sont pas classés, de sorte que les éléments n'apparaissent pas dans l'ordre dans lequel ils ont été insérés.
Comme @IoaTzimas le souligne correctement dans les commentaires, c'est que vous avez un malentendu fondamental sur le fonctionnement des touches dict
. dict
clés dict
doivent être uniques (pensez à une clé interne) car la clé correspond à la valeur.
Simple and Easy:- v_str='hello' class Dictlist(dict): def __setitem__(self, key, value): try: self[key] except KeyError: super(Dictlist, self).__setitem__(key, []) self[key].append(value) p_dict=Dictlist() for i, j in enumerate(v_str): p_dict[j]=i print(p_dict) # output:-{'h': [0], 'e': [1], 'l': [2, 3], 'o': [4]}
Votre solution aurait les mêmes résultats que l'OP obtenait à l'origine.
Le dictionnaire n'a pas de clés en double :) L'ajout d'une autre réponse peut être utile
Je n'ai pas remarqué que vous les ajoutiez dans des listes, désolé!
{'h': 1, 'e': 2, 'l': 3, 'l': 4, 'o': 5}
n'est pas correct. Vous ne pouvez pas avoir de doublons dans les clés dict ('l' dans votre cas)Les dictionnaires ne sont pas non plus classés, vous ne verrez donc pas les lettres dans l'ordre d'itération de la chaîne
@OneCricketeer Voir stackoverflow.com/questions/39980323/...
@Barmar Les vieilles habitudes meurent dur: /