Seite 1 von 2

Verfasst: Sonntag 18. März 2007, 22:56
von EyDu
Leonidas hat geschrieben:Man könnte auch noch Threads rauspacken, so wie blackbird bei den Es.
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.

Verfasst: Montag 19. März 2007, 00:07
von birkenfeld
sape hat geschrieben:
birkenfeld hat geschrieben:@sape: dein erstes Beispiel im zweiten Post sortiert falsch.
Warum :? Weil '2: foobar' vor '2: barfoo' kommt?
Nein, weil "10: barfoo" vor "1: barfoo" kommt.
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, mit einstelligen Zahlen funktioniert es schon. Mit mehrstelligen nicht.
Leonidas' Lösung ist am geschicktesten IMO.
Die Lösung sortiert aber nicht.
Ja, das ist trivial anzuhängen.

Verfasst: Montag 19. März 2007, 12:16
von Michael Schneider
birkenfeld hat geschrieben:
sape hat geschrieben:
birkenfeld hat geschrieben:@sape: dein erstes Beispiel im zweiten Post sortiert falsch.
Warum :? Weil '2: foobar' vor '2: barfoo' kommt?
Nein, weil "10: barfoo" vor "1: barfoo" kommt.
Hi,

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()
Dass foobar vor barfoo kommt ist logisch, wenn man rückwärts sortiert. :-)

Grüße,
Michel

Verfasst: Montag 19. März 2007, 14:07
von birkenfeld
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.

Verfasst: Montag 19. März 2007, 19:58
von sape
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 :D

Zweite vom zweiten Post:
[{10: 'barfoo'}, {4: '43'}, {3: 'blubb'}, {1: 'foobar'}]

Verfasst: Dienstag 20. März 2007, 07:55
von Michael Schneider
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)

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)
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

Verfasst: Dienstag 20. März 2007, 11:12
von BlackJack
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)