Seite 1 von 1
Die Anzahl des Vorkommen eines unbekannten Substrings zählen
Verfasst: Freitag 7. April 2006, 16:46
von lakeck
Hallo,
folgendes Problem:
ich lese ein File in einer for-Schleife per
.readlines ein. Dabei zerlege ich die Zeile in
einzelne Substrings, soweit kein Problem.
Nun möchte ich das Vorkommen eines bestimmten Substrings,
sagen wir [0:6] (den ich nicht kenne) zählen.
Bsp.:
060507xxxx
060507xxxx
060507xxxx
060506xxxx
060506xxxx
Hier kommt 060507 3x vor und 060506 kommt 2x vor.
Ich möchte den Substring, der am häufigsten vorkommt,
bestimmen und dann übernehmen (den ich aber wie gesagt
vorher nicht kenne).
Wie geht man denn soetwas an ??
THX a lot,
Lakeck
Re: Die Anzahl des Vorkommen eines unbekannten Substrings zä
Verfasst: Freitag 7. April 2006, 17:09
von gerold
lakeck hat geschrieben: Nun möchte ich das Vorkommen eines bestimmten Substrings, sagen wir [0:6] (den ich nicht kenne) zählen.
Hi Lakeck!
Mir fällt diesmal keine kurze Möglicheit ein. Deshalb:
Code: Alles auswählen
original_liste = [
"060507xxxx",
"060507xxxx",
"060507xxxx",
"060506xxxx",
"060506xxxx",
]
gekuerzte_liste = [ item[:6] for item in original_liste ]
anzahl = {}
for item in set(gekuerzte_liste):
anzahl[item] = gekuerzte_liste.count(item)
ergebnisliste = [
[item, anzahl[item[:6]]] for item in original_liste
]
print ergebnisliste
Code: Alles auswählen
[['060507xxxx', 3], ['060507xxxx', 3], ['060507xxxx', 3], ['060506xxxx', 2], ['060506xxxx', 2]]
mfg
Gerold

Verfasst: Freitag 7. April 2006, 17:43
von Joghurt
Andere Möglichkeit:
Code: Alles auswählen
strings = {}
datei = open("...","rt")
for line in datei:
s = line[0:6]
try:
strings[s] += 1
except KeyError:
strings[s] = 1
liste = strings.items()
liste.sort(lambda a,b: -cmp(a[1],b[1]))
print liste
DANKE !!
Verfasst: Freitag 7. April 2006, 18:27
von lakeck
Danke !!
Das haut prima hin ...
PUH: liste.sort(lambda a,b: -cmp(a[1],b[1])) ... harter Tobak, oder ?
Egal, genau das was ich benötige.
Nochmals: 1000 Dank !!
Thx a lot,
Lakeck
Verfasst: Freitag 7. April 2006, 19:35
von digitus
Ich erledige Häufigkeiten zählen gerne mit dem get-"Trick":
Code: Alles auswählen
>>> l = [
"060507xxxx",
"060507xxxx",
"060507xxxx",
"060506xxxx",
"060506xxxx"]
>>> def getMostFreqSubstr(strSeq, leftPos, rightPos):
firstSub = strSeq[0][leftPos:rightPos+1]
subStrCount = {firstSub:1}
mostFreq = firstSub
for s in strSeq:
sub = s[leftPos:rightPos+1]
subStrCount[sub] = subStrCount.get(sub, 0) + 1
if subStrCount[sub] > subStrCount[mostFreq]:
mostFreq = sub
return mostFreq
>>> getMostFreqSubstr(l, 0, 5)
'060507'
Könnte minimal effizienter sein, da statt einer zweiten Iteration in sort() jeweils nur mit einer Referenz (mostFreq) verglichen wird. Aber Dicts sind ja Pflicht bei sowas, sonst bekommt man quadratische Laufzeit.