Je voudrais parcourir un dictionnaire et ajouter chaque clé (lettre) répétée par le nombre de fois de sa valeur (fréquence) à une nouvelle liste.
Par exemple:
entrée: {'A': 1, 'B': 2}
. Résultat attendu: ['A', 'B', 'B']
Ce que je fais ne fonctionne pas. Que dois-je écrire dans ma fonction pour faire cela?
def get_freq_dict(): freq_dict = {'J' : 1, 'K' : 1, 'Q' : 1, 'X' : 1, 'Z' : 1,\ 'B' : 2, 'C' : 2, 'F' : 2, 'H' : 2, 'M' : 2, 'P' : 2,\ 'V' : 2, 'W' : 2, 'Y' : 2, '' : 2,\ 'G' : 3, 'D' : 4, 'L' : 4, 'S' : 4, 'U' : 4,\ 'N' : 6, 'R' : 6, 'T' : 6, 'O' : 8, 'A' : 9, 'I' : 9,\ 'E' : 12} return freq_dict def bag_of_letters(freq_dict): freq_lst = [] for key, value in freq_dict.items(): for range in(value): freq_lst.append(value) return freq_lst def main(): freq_dict = get_freq_dict() freq_lst = bag_of_letters(freq_dict) print(freq_dict, freq_lst) main()
5 Réponses :
Vous devriez plutôt parcourir une plage
et ajouter la clé
plutôt que value
:
def bag_of_letters(freq_dict): return [i for k, v in freq_dict.items() for i in [k] * v]
Vous pouvez également utiliser une compréhension de liste:
for key, value in freq_dict.items(): for _ in range(value): freq_lst.append(key)
freq_lst.extend ([clé] * valeur)
?
Merci qui a plus de sens. Cependant, j'ai toujours des problèmes avec la sortie imprimée. Cela me donne ce que je recherche mais aussi le dictionnaire original en plus. ex - {'J': 1, 'K': 1, 'Q': 1, '.... [' J ',' K ',' Q ',… ..]} où tout ce que je regarde car est ['J', 'K', 'Q',… ..]}
@Tim Vous pouvez print (freq_lst)
au lieu de print (freq_dict, freq_lst)
.
Le coupable :
[['J'], ['K'], ['Q'], ['X'], ['Z'], ['B', 'B'], ['C', 'C'], ['F', 'F'], ['H', 'H'], ['M', 'M'], ['P', 'P'], ['V', 'V'], ['W', 'W'], ['Y', 'Y'], ['', ''], ['G', 'G', 'G'], ['D', 'D', 'D', 'D'], ['L', 'L', 'L', 'L'], ['S', 'S', 'S', 'S'], ['U', 'U', 'U', 'U'], ['N', 'N', 'N', 'N', 'N', 'N'], ['R', 'R', 'R', 'R', 'R', 'R'], ['T', 'T', 'T', 'T', 'T', 'T'], ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'O'], ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'], ['I', 'I', 'I', 'I', 'I', 'I', 'I', 'I', 'I'], ['E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E']]
Le sauveteur :
print([list(j) for i, j in groupby(freq_lst)])
D'où :
for i in range(0, value): freq_lst.append(key)
OUTPUT :
print(freq_lst)
OU
si vous voulez qu'ils joliment associés :
print(freq_dict, freq_lst)
OP : Cependant, j'ai toujours des problèmes avec la sortie imprimée. Cela me donne ce que je recherche mais aussi le dictionnaire original en haut
Réponse : parce que vous imprimez à la fois le dict code > et la
list
:
for i in range(value): freq_lst.append([key]*value)
Il suffit d'imprimer la liste
à la place:
['J', 'K', 'Q', 'X', 'Z', 'B', 'B', 'C', 'C', 'F', 'F', 'H', 'H', 'M', 'M', 'P', 'P', 'V', 'V', 'W', 'W', 'Y', 'Y', '', '', 'G', 'G', 'G', 'D', 'D', 'D', 'D', 'L', 'L', 'L', 'L', 'S', 'S', 'S', 'S', 'U', 'U', 'U', 'U', 'N', 'N', 'N', 'N', 'N', 'N', 'R', 'R', 'R', 'R', 'R', 'R', 'T', 'T', 'T', 'T', 'T', 'T', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'I', 'I', 'I', 'I', 'I', 'I', 'I', 'I', 'I', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E']
Vous voilà
freq_dict = {'J' : 1, 'K' : 1, 'Q' : 1, 'X' : 1, 'Z' : 1,\ 'B' : 2, 'C' : 2, 'F' : 2, 'H' : 2, 'M' : 2, 'P' : 2,\ 'V' : 2, 'W' : 2, 'Y' : 2, '' : 2,\ 'G' : 3, 'D' : 4, 'L' : 4, 'S' : 4, 'U' : 4,\ 'N' : 6, 'R' : 6, 'T' : 6, 'O' : 8, 'A' : 9, 'I' : 9,\ 'E' : 12} def bag_of_letters(): freq_lst = [] for key in freq_dict: for i in range(0, freq_dict[key]): freq_lst.append(key) return freq_lst def main(): freq_lst = bag_of_letters() print(freq_lst) main()
résultat ['J', 'K', 'Q', 'X', 'Z', 'B', ' B ',' C ',' C ',' F ',' F ',' H ',' H ',' M ',' M ',' P ',' P ',' V ',' V ' , 'W', 'W', ecc]
Vous pouvez exploiter le fait que
Si items (), keys (), values (), iteritems (), iterkeys () et itervalues () sont appelés sans modification du dictionnaire, le les listes correspondront directement.
comme indiqué dans ce sujet , vous pouvez donc simplement faire:
out = list(itertools.chain.from_iterable(out))
J'ai utilisé itertools
pour aplatir la liste, si vous ne souhaitez pas importer itertools
vous pouvez faire:
out = sum(out,[])
au lieu de
import itertools x = {'A':1, 'B':2} out = list(map(lambda x,y: [x]*y, x.keys(), x.values())) print(out) #[['A'], ['B', 'B']] out = list(itertools.chain.from_iterable(out)) print(out) #['A', 'B', 'B']
p >
Vous pouvez facilement le faire avec Counter
:
from collections import Counter d = {'C': 3, 'B': 2, 'A': 1} c = Counter(d) list(c.elements()) # ['C', 'C', 'C', 'B', 'B', 'A']
pour la plage dans (valeur):
semble suspect, peut-être repenser cette ligne.Veuillez également ajouter dans votre question ce qui ne fonctionne pas exactement. Obtenez-vous une exception? Quel est votre résultat?
Est-ce que cela répond à votre question? Convertir le dictionnaire en liste avec une longueur basée sur des valeurs