2017-04-08 4 views
0

Also ich habe Algorithmen Frage. Angenommen, wir haben ein Wort, alle Buchstaben im Wort müssen nach der Häufigkeit ihres Auftretens sortiert werden, beginnend mit den häufigsten. Zum Beispiel "Angenommen" wird wie "ppSsuoe" oder "Sspspoeu" und so weiter aussehen.Häufigkeit von Buchstaben in Wort

Ich denke, dass ich Wort zur Liste hinzufügen, gleiche Buchstaben finden, berechnen, wie viel gleiche Buchstaben ich habe und an den Anfang der Liste anhängen, die Buchstaben, die nur einer entsprechen, können zufällig gedruckt werden.

Aber nach dem Anhängen von Wort zu Liste, ich weiß nicht, was ich tun soll. Wie finde ich dieselben Buchstaben? wie man sie sortiert und an den Anfang des Wortes anfügt? Sollte ich temporäre Liste verwenden? Oder ich sollte das Schlüssel: Wert-Wörterbuch verwenden?

name = 'Suppose' 
list = [] 
for letter in name:  
    list.append(letter) 
+0

Verwenden Sie einen 'Counter' aus der Sammlung Modul –

+0

Ich habe versucht, es zu benutzen, wissen aber nicht heiß mit Folge davon eine neue Zeichenfolge und fügen Sie arbeiten –

Antwort

1

Sie können eine Collection verwenden, durch eine geeignete Art folgt:

>>> from collections import Counter 
>>> f = Counter("Suppose") 
>>> ''.join(k*v for k,v in sorted(f.items(), reverse = True,key = lambda p:p[1])) 
'ppuSseo' 

ist jedoch zu beachten, dass die endgültige Reihenfolge der Buchstaben mit der gleichen Frequenz durch dieses Verfahren nicht spezifiziert ist. Hier wird nur garantiert, dass häufigere Buchstaben vor weniger häufig erscheinen. Wenn Sie z.B. Buchstaben der gleichen Frequenz, um selbst alphabetisch sortiert zu sein, benötigen Sie ein anderes key Argument.

+0

Vielen Dank! –

1

Zunächst wandeln wir unsere Eingabe in ein Wörterbuch, jedes Element über Counter zählen. Als nächstes verwenden wir sorted, um das Wörterbuch in die von uns gewünschte Reihenfolge zu sortieren (vom größten zum kleinsten). Schließlich führen wir eine Schleife über das Wörterbuch und fügen unsere Elemente wieder in Zeichenfolgenform ein, so dass p:2 zu pp wird. Danach verbinden wir alle unsere Elemente über eine join zu einer Zeichenfolge.

from collections import Counter 

name = 'Suppose' 
results = Counter(name) 
print("".join([k * results[k] for k in sorted(results, key=lambda a: results[a], reverse = True)])) 
+0

kennen das, aber, wie Druckergebnis als Zeichenkette wie "ppSuseo", becoure Resultat sieht wie dieses aus Counter ({'p': 2, 'u': 1, 'S': 1, 's': 1, 'o': 1 , 'e': 1}) –

+0

Meine Antwort wurde aktualisiert. Wenn Sie als Lösung markieren könnten, würde es sehr helfen. – Neil

+0

Vielen Dank! Aber es sieht für mich wie schwierig aus, kannst du die letzte Zeile erklären? –

0
from collections import OrderedDict 
name = 'Suppose' 
my_dictionary = dict() 
for letter in name.lower():  
    if letter in my_dictionary.keys(): 
     my_dictionary[letter] += 1 
    else: 
     my_dictionary[letter] = 1 
my_dictionary = OrderedDict(sorted(my_dictionary.items(), key=lambda x:x[1], reverse=True)) 

new_word = str() 
for key, value in my_dictionary.items(): 
    new_word += (value*key) 

print (new_word) 

Die Art, wie ich es tun würde, ist zuerst erstellen Sie ein Diktat mit Schlüssel den Buchstaben und Wert die Anzahl der Vorkommen. Vergessen Sie nicht, name.lower() zu verwenden, um das Wort zuerst zu dekapitisieren. Sortieren Sie dann das Diktat nach den Werten in absteigender Reihenfolge. Schließlich zu erstellen, um es den Schlüssel * Wert

0
string='suppose' 
counts=[0]*26  #initialize a 26-sized array for each alphabet 
for letter in string: 
counts[ord(letter.lower())-97]+=1 #for each alphabet in the string update the count 

greatest=0   #initialize largest count to 0 
for count in counts: #look for each alphabet count 
if count>greatest:greatest=count #update the greatest count 

while greatest:        #while greatest doesn't equal to 0 
for i in range(len(counts)):    #look up all counts 
    if counts[i]==greatest: print(end=chr(i+97)*greatest) #the current alphabet has greatest count(as of yet) so print it 'greatest' times, the end is kept to skip newline 
greatest-=1         #update greatest count 
print()         #newline feed 
Verwandte Themen