häufigkeiten von strings

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
EyDu
User
Beiträge: 4868
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Beitragvon EyDu » Sonntag 18. März 2007, 22:56

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.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Montag 19. März 2007, 00:07

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Montag 19. März 2007, 12:16

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Montag 19. März 2007, 14:07

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Beitragvon sape » Montag 19. März 2007, 19:58

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'}]
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Dienstag 20. März 2007, 07:55

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
BlackJack

Beitragvon BlackJack » Dienstag 20. März 2007, 11:12

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)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder