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
Die Anzahl des Vorkommen eines unbekannten Substrings zählen
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi Lakeck!lakeck hat geschrieben: Nun möchte ich das Vorkommen eines bestimmten Substrings, sagen wir [0:6] (den ich nicht kenne) zählen.
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]]
Gerold

http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
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
Ich erledige Häufigkeiten zählen gerne mit dem get-"Trick":
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.
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'