Nee, nee, so war meine Lösung nicht gemeint, sondern eher ein Vorschlag wie man es noch machen könnte. Und ich muss sagen, dieser Thread hat doch ganz brauchbare Variationen hervorgebracht, wie man an so ein Problem herangehen kann, auch wenn man sie eventuell als Einsteiger nicht sofort versteht.Leonidas hat geschrieben:Man könnte auch noch Threads rauspacken, so wie blackbird bei den Es.
häufigkeiten von strings
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Nein, weil "10: barfoo" vor "1: barfoo" kommt.sape hat geschrieben:Warum Weil '2: foobar' vor '2: barfoo' kommt?birkenfeld hat geschrieben:@sape: dein erstes Beispiel im zweiten Post sortiert falsch.
Ja, mit einstelligen Zahlen funktioniert es schon. Mit mehrstelligen nicht.Ansonsten sehe ich nicht wo falsch sortiert wird:
Zweiter Post erstes Beispiel:
['4: 43', '3: blubb', '2: foobar', '2: barfoo']
Zweiter Post zweites Beispiel:
[{4: '43'}, {3: 'blubb'}, {2: 'foobar'}, {2: 'barfoo'}]
Ja, das ist trivial anzuhängen.Die Lösung sortiert aber nicht.Leonidas' Lösung ist am geschicktesten IMO.
- Michael Schneider
- User
- Beiträge: 569
- Registriert: Samstag 8. April 2006, 12:31
- Wohnort: Brandenburg
Hi,birkenfeld hat geschrieben:Nein, weil "10: barfoo" vor "1: barfoo" kommt.sape hat geschrieben:Warum Weil '2: foobar' vor '2: barfoo' kommt?birkenfeld hat geschrieben:@sape: dein erstes Beispiel im zweiten Post sortiert falsch.
das Problem kenne ich nur zu gut. Der Doppelpunkt hat den Characterwert 58, Zahlen aber kleinere. Dadurch werden kürzere Zahlen nach unten sortiert. Wenn es nur um die Ausgabe geht, kann man die Zahlen vorn mit Leerzeichen auffüllen, die stehen dann oben:
Code: Alles auswählen
iMax = max(frequencies)
l = ["%*s: %s" % (iMax, iAnzahl, sString) for sString, iAnzahl in frequencies.items()]
l.sort()
Grüße,
Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
- birkenfeld
- Python-Forum Veteran
- Beiträge: 1603
- Registriert: Montag 20. März 2006, 15:29
- Wohnort: Die aufstrebende Universitätsstadt bei München
Ja, man kann auch über China nach Amerika fliegen. Man kann aber auch einfach die Zahlen als Integers belassen und sortieren, anstatt sie vorher in Strings umzuwandeln.
Birkenfeld und Michael, danke für euren Hinweiß, das hatte ich nicht beachtet.
EDIT: Hab nochmal meine zweite variante (im zweiten post) getestet und die scheint zu gehen
Zweite vom zweiten Post:
[{10: 'barfoo'}, {4: '43'}, {3: 'blubb'}, {1: 'foobar'}]
EDIT: Hab nochmal meine zweite variante (im zweiten post) getestet und die scheint zu gehen
Zweite vom zweiten Post:
[{10: 'barfoo'}, {4: '43'}, {3: 'blubb'}, {1: 'foobar'}]
- Michael Schneider
- User
- Beiträge: 569
- Registriert: Samstag 8. April 2006, 12:31
- Wohnort: Brandenburg
Wenn man es nicht direkt als String ausgeben möchte, hat natürlich Gerold mit seinen Tupeln den Vogel abgeschossen.
Als Integer allein ohne den zugehörigen Wert bringt das nicht viel, dann muss man die ja wieder extra zuordnen.
(Zitat frei nach Gerold)
Diese dürfte nun wirklich zu den elegantesten und kürzesten Lösungen gehören (unabhängig davon, dass man die Deklarationen und die for-Schleife zusammenquetschen könnte.
Grüße,
Michel
Als Integer allein ohne den zugehörigen Wert bringt das nicht viel, dann muss man die ja wieder extra zuordnen.
(Zitat frei nach Gerold)
Code: Alles auswählen
words = ('bla', 'bla', 'blub', 'hallo', 'hallo', "z", "z", "hallo")
frequencies = dict()
for word in words:
frequencies[word] = frequencies.get(word, 0) + 1
print sorted([ (value, key) for (key, value) in frequencies.items() ], reverse=True)
Grüße,
Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Noch eine Spur mehr "lazy" und ohne "umpacken" der Tupel:
Code: Alles auswählen
from operator import itemgetter
def get_most_occuring_values(iterable):
histogram = dict()
for item in iterable:
histogram[item] = histogram.get(item, 0) + 1
return sorted(histogram.iteritems(), key=itemgetter(1), reverse=True)