1
votes

Comment faire en sorte que python utilise l'ordre des lettres d'une chaîne dans le cadre d'un dictionnaire avec des valeurs pour le nombre de fois où chaque lettre unique apparaît

1) Tout d'abord, je suis conscient que les ensembles et les dictionnaires n'ont pas d'ordre, la question me déroute et j'essaie de comprendre cela, vous pouvez voir ci-dessous mes efforts pour trouver comment résoudre le problème. 2) Je sais que l'apparence de la question est médiocre, alors désolé à l'avance, je ne sais pas comment la rendre plus ordonnée ici, j'ai passé plus d'une demi-heure à essayer de la faire dans le bon format, etc. :-) et ce n'est toujours pas comme je voudrais que ce soit.

Résumé: Ma difficulté est que la question m'oblige à produire un dictionnaire avec des valeurs dans un certain ordre afin que je puisse obtenir la réponse de valeurs spécifiques. Je peux le faire sans l'ordre qu'il demande, sauf si j'ai mal compris.

https://courses.edx.org/courses/course-v1:HarvardX+PH526x+1T2020/discussion/forum/02c9dea99fef73e4d6bdb312bb1869352afb68aa/threads/5edbfbc4eac4b40877a1abd4

Voici la question du cours à laquelle je fais référence, j'ai essayé certaines des choses qui n'ont pas abouti selon la réponse requise:

(si vous ne voulez pas vérifier le lien de la réponse que j'obtiens du code est ici:

    a = sentence
    b = dict.fromkeys(a[i], 0)
    for i in a[i]:
        b[i] += 1


    #A = set(alphabet)
    #A = list(A)
    #B = set(sentence)

        #B = list(B)

    #maybe = set(B)&set(A)

    #letter_set = set(A) & set(B)

    letter_list = list(letter_set)

    common = sorted(set(A).intersection(set(B)) ,key=lambda x:B.index(x))

    letter_list = common #it is already a list

    count_letters = {}

    cnt_lowercase = 0

    cnt_uppercase = 0

    count = 0


    #iterate over the letter_list
    for i in range (len(letter_list)-1):
        #count matches for each letter of the sentence
        for j in range(len(sentence)-1):
            gr = letter_list[i] in sentence[j]
            print i,j
            print("sentence letter : " , letter_list[i], "sentence letter: " + sentence[j])

            print  gr 
            if gr == True:
                count +=1;
                if j == len(sentence)-1:
                    print("count= " , count)
                    count_letters[i] = count
            print(count_letters)
        if j > len(sentence):
            print("reached the last letter of the sentence: " , sentence[j])
            count = 0
    print j
    print ("length of the sentence is : " , len(sentence))
    print count_letters
    print letter_list

    common = sorted(set(A).intersection(set(B)) ,key=lambda x:B.index(x)) 

Les lettres minuscules et majuscules de l'alphabet anglais doivent être stockées comme l'alphabet variable de chaîne.

Considérez la phrase «Jim s'est rapidement rendu compte que les belles robes coûtent cher». Créez un dictionnaire count_letters avec des clés composées de chaque lettre unique de la phrase et des valeurs constituées du nombre de t imes chaque lettre est utilisée dans cette phrase. Comptez les lettres majuscules et minuscules séparément dans le dictionnaire.

Quelle est la 3ème valeur du dictionnaire? Astuce: rappelez-vous que Python est indexé à zéro!

ma réponse 1, correcte (YAY vraiment dopamine hit)

Quelle est la 8ème valeur du dictionnaire? Astuce: rappelez-vous que Python est indexé à zéro!

3 correct (OUI je pense ... pourquoi c'était après de nombreuses tentatives de regarder ma réponse qui n'avait alors aucun sens)

Notez que j'ai accidentellement obtenu la deuxième réponse correcte, et je ne sais pas pourquoi.

Apparemment, l'ordre des clés dans le dictionnaire doit être dans {J: value, i: value} J'ai essayé le compteur si vous voyez le lien que vous pouvez voir à partir de mes tentatives initiales et qui ne fournit pas la réponse requise, j'ai essayé set (phrase) & set (alphabet) qui fournit l''ordre 'suivant: {'J', 'une', «b», «c», 'ré', «e», 'F', 'g', «h», 'je', «k», «l», «m», 'n', «o», «p», «q», «r», 's', 't', 'u', 'v', «w», 'X', 'y', 'z'}

J'ai essayé pendant plusieurs jours de temps en temps pendant des heures à essayer des choses en vain, j'ai eu l'espoir quand j'ai vu il y a quelques pages que d'une réponse de dépassement de pile, voir le code ci-dessous m'a donné j'espère ... Cela a vraiment fonctionné UNE FOIS dans la ligne de commande (J, i, m ...) mais après pour une raison quelconque, il est retourné à Jabcde ....)

J'ai également trouvé ceci utile et très court mais j'ai quand même le problème de la 'commande' de l'ensemble étant comme avant:

    import string
    alphabet = string.ascii_letters
    alphabet
    sentence = 'Jim quickly realized that the beautiful gowns are expensive'

Compter l'occurrence de lettres uniques dans une chaîne en Python 3

Voici aussi plus de code.

comme vous pouvez le voir à un moment donné, j'essaie de forcer un ordre d'une sorte que je ne pense pas possible pour la clé et la valeur de la question et réponse pour être heureux.

voici plus de code: dans ma jungle de confusion.

    a = sentence
    b = dict.fromkeys(a[i], 0)
    for i in a[i]:
        b[i] += 1

Python maintient l'ordre dans l'intersection des listes

Cela permet à la liste d'être dans le même ordre que la phrase. J'utilise A comme alphabet et B comme liste Hourra !!! Merci Kasramvd mais hélas cela n'a fonctionné que dans la ligne de commande lorsque j'ai réajusté la commande (UNE FOIS). Mais m'a donné l'espoir de continuer à pousser. Comme vous pouvez le voir, j'ai commenté le code au cas où je voudrais l'utiliser. J'utilise l'interface canopy python3.

   {' ': 8, 'e': 8, 'i': 5, 'a': 4, 't': 4, 'l': 3, 'u': 3, 'h': 2, 'n': 2, 's': 2, 'r': 2, 'J': 1, 'c': 1, 'b': 1, 'd': 1, 'g': 1, 'f': 1, 'k': 1, 'm': 1, 'o': 1, 'q': 1, 'p': 1, 'w': 1, 'v': 1, 'y': 1, 'x': 1, 'z': 1})

donc cela reste fondamentalement défini (A) et set (B)

Des idées ??? Je suis trop têtu pour laisser tomber cela, après cela, je vais simplement le transformer en une fonction afin que je puisse répondre à la question suivante car cela est nécessaire pour une chaîne beaucoup plus grande de plus de 5 lignes. Je reviendrai probablement si je reste bloqué.

J'espère qu'il y avait suffisamment d'informations.


6 commentaires

Nous ne pouvons pas voir le lien si nous n'avons pas de compte edx. Si je comprends bien, vous voulez convertir une chaîne en dictionnaire avec une lettre comme clé, un certain nombre d'occurrences comme valeurs.


Je pense que vous pouvez trier (dans l'ordre spécifié) les lettres de votre phrase et ensuite appliquer votre script.


Je crois qu'après python3.7, tous les dictionnaires resteront ordonnés même sans utiliser de collections.OrderedDict ... donc le problème est que vous définissez les décomptes dans l'ordre d'apparition des lettres ... comme @ Ed.Kenbers, assurez-vous simplement les lettres sont triées par ordre alphabétique avant d'appliquer votre code ... ou de le réorganiser après coup


@ Ed.Kenbers, la question du questionnaire edx est la suivante: Considérez la phrase «Jim s'est rapidement rendu compte que les belles robes coûtaient cher». Créez un dictionnaire count_letters avec des clés constituées de chaque lettre unique dans la phrase et des valeurs constituées du nombre de fois que chaque lettre est utilisée dans cette phrase. Comptez les majuscules et les minuscules séparément dans le dictionnaire.


@Derek Eden quelle méthode utiliserais-je pour créer l'ordre requis de mon ensemble de lettres uniques dans la phrase en étant le même que l'ordre des lettres dans la phrase? Comme vous pouvez le voir, je n'ai pas réussi à aller très loin dans mes tentatives.


@ Ed.Kenbers le même commentaire vous a été adressé, mais vous n'a pas pu vous taguer tous les deux


5 Réponses :


0
votes

Je pense que le moyen le plus simple de le faire serait d'utiliser simplement la fonction Counter puis de trier après coup comme ceci:

{' ': 8, 'J': 1, 'a': 4, 'b': 1, 'c': 1, 'd': 1, 'e': 8, 'f': 1, 'g': 1, 'h': 2, 'i': 5, 'k': 1, 'l': 3, 'm': 1, 'n': 2, 'o': 1, 'p': 1, 'q': 1, 'r': 2, 's': 2, 't': 4, 'u': 3, 'v': 1, 'w': 1, 'x': 1, 'y': 1, 'z': 1}

output:

from collections import Counter
sentence = 'Jim quickly realized that the beautiful gowns are expensive'
counts = Counter(sentence)
out = dict(sorted(counts.items()))


2 commentaires

c'est bien et c'est ce que j'ai essayé au départ ... mais grâce à vous, je me rends compte maintenant que c'est la réponse à la question: DI ne l'ai pas vu avant, j'avais ce résultat d'avant, mais je ne me souviens pas qu'il fonctionnait .


Je viens de réaliser en regardant à nouveau la question que cela ne fonctionnera pas parce que la réponse au 8ème objet dictionnaire est censée être 3.



1
votes

Les dictionnaires sont des ensembles d'éléments non ordonnés sous la forme de paires clé: valeur . J'ai fait le problème comme:

{'J': 1, 'i': 5, 'm': 1, ' ': 8, 'q': 1, 'u': 3, 'c': 1, 'k': 1, 'l': 3, 'y': 1, 'r': 2, 'e': 8, 'a': 4, 'z': 1, 'd': 1, 't': 4, 'h': 2, 'b': 1, 'f': 1, 'g': 1, 'o': 1, 'w': 1, 'n': 2, 's': 2, 'x': 1, 'p': 1, 'v': 1}

J'ai créé un dictionnaire vide d et stocké la chaîne dans variable s . Ensuite, j'ai utilisé la boucle for en prenant chaque élément de la chaîne s dans i , puis en ajoutant les paires clé / valeur en attribuant des valeurs aux clés: dict_name [key ] = valeur . Les valeurs sont ajoutées par la méthode string string_var.count (element) : elle compte le nombre de fois qu'un élément apparaît dans la string_var . De cette façon, toutes les paires clé: valeur sont ajoutées dans le dictionnaire vide.

Ceci imprime la sortie souhaitée:

d={}
s="Jim quickly realized that the beautiful gowns are expensive"
for i in s:
    d[i]=s.count(i)
print(d)

J'espère que cela vous a été utile! p>


6 commentaires

merci, c'est encore plus utile pour mon apprentissage de s'améliorer à pyhon, j'ai réalisé que la tentative initiale était correcte, je ne sais pas pourquoi je ne l'ai pas fait fonctionner, j'aurais dû juste faire set (A) & set (B) puis les mettre dans les clés, non? Votre technique est quelque chose qui m'aidera à me souvenir pour l'avenir


Ouais! Merci! Je suis heureux d'avoir pu aider!


Je ne sais pas pourquoi mais j'obtiens cette sortie en utilisant votre code, savez-vous pourquoi? {'': 8, 'J': 1, 'a': 4, 'c': 1, 'b': 1, 'e': 8, 'd': 1, 'g': 1, 'f ': 1,' i ': 5,' h ': 2,' k ': 1,' m ': 1,' l ': 3,' o ': 1,' n ': 2,' q ': 1, 'p': 1, 's': 2, 'r': 2, 'u': 3, 't': 4, 'w': 1, 'v': 1, 'y': 1, 'x': 1, 'z': 1}


Et j'aurais besoin d'annuler le caractère d'espace, donc je pense que j'ai besoin d'un si statemet pour ce droit?


Oui si cela le résoudrait. Et je suis désolé, je ne sais pas pourquoi votre sortie diffère de la mienne, je viens de relancer mon code et la sortie est: {'J': 1, 'i': 5, 'm': 1, '': 8, 'q': 1, 'u': 3, 'c': 1, 'k': 1, 'l': 3, 'y': 1, 'r': 2, 'e' : 8, 'a': 4, 'z': 1, 'd': 1, 't': 4, 'h': 2, 'b': 1, 'f': 1, 'g': 1 , 'o': 1, 'w': 1, 'n': 2, 's': 2, 'x': 1, 'p': 1, 'v': 1}


peut-être que mon ordinateur portable ou mon logiciel aime me rendre les choses difficiles, il se peut que le logiciel supplémentaire intelligent y soit ajouté avec une émotion expérimentale évoquant l'utilisateur pour devenir partiellement confus: p



0
votes

Je viens de vérifier la réponse à l'émission après avoir réalisé cette option, la voici:

print(count_letters)

1

print(list(count_letters.values())[7])

3

for letter in sentence:
    if letter in alphabet:
        if letter in count_letters.keys():
            count_letters[letter] += 1
        else:
            count_letters[letter] = 1
            
print(list(count_letters.values())[2])

{'J': 1, 'a': 4, 'c': 1, 'b': 1, 'e': 8, 'd': 1, 'g ': 1,' f ': 1,' i ': 5,' h ': 2,' k ': 1,' m ': 1,' l ': 3,' o ': 1,' n ': 2, 'q': 1, 'p': 1, 's': 2, 'r': 2, 'u': 3, 't': 4, 'w': 1, 'v': 1, 'y': 1, 'x': 1, 'z': 1}

hmmm .... c'est dommage que les réponses plus courtes ne fonctionnent pas mais je suppose que cela n'assume aucune fonction antérieure qui est toujours bon. Et j'ai mal compris la question en pensant que j'avais besoin de l'ordre de Jim. J'ai besoin de comprendre les étapes de ce programme maintenant, car le simple fait d'avoir la réponse ne sera pas suffisant car j'essaie de comprendre maintenant où il se rend compte que count_letters.keys () a des informations quand il a été initialement déclaré comme vide ... se passe ici pour qu'il détecte qu'il a les données requises.


0 commentaires

0
votes

J'ai ajouté des commentaires et imprimé des instructions pour que je puisse voir et comprendre pourquoi ce code fonctionne comme il le souhaite et j'espère qu'il aidera quelqu'un d'autre

sentence = 'Jim quickly realized that the beautiful gowns are expensive'
count_letters = {}
for letter in sentence:
    print ("letter in sentence is: ", letter) 
    if letter in alphabet: # so if there are spaces they will not be included into the dictionary
        print ("letter in alphabet is: ", letter) 
        if letter in count_letters.keys(): #becuase it has found a letter in both the sentence and alphabet in the first finding
            count_letters[letter] += 1
            print ("count_letters[letter] is: ",count_letters[letter])
            print ("letter is: " , letter)
        else:
            count_letters[letter] = 1
            print ("count_letters[letter] is: ",count_letters[letter])
            print ("letter is: " , letter)
    else: # this will help me realise when that happens
         print ("letter: ")
         print (letter)
         print("not in alphabet")
print(count_letters)            
print(list(count_letters.values())[2])
print(list(count_letters.values())[7])


0 commentaires

1
votes

Je pense que le code correct est:

{
    'J': 1, 'i': 5, 'm': 1, 'q': 1, 'u': 3, 'c': 1, 'k': 1, 'l': 3, 
    'y': 1, 'r': 2, 'e': 8, 'a': 4, 'z': 1, 'd': 1, 't': 4, 'h': 2, 
    'b': 1, 'f': 1, 'g': 1, 'o': 1, 'w': 1, 'n': 2, 's': 2, 'x': 1, 
    'p': 1, 'v': 1
}

Donc, sans espaces, vous obtiendrez 1 pour la 3ème valeur du dictionnaire et 3 pour la 8ème. Le résultat est:

s="Jim quickly realized that the beautiful gowns are expensive"
alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
print(dict([[i, s.count(i)] for i in s if i in alphabet]))


0 commentaires