Die Anzahl des Vorkommen eines unbekannten Substrings zählen

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.
Antworten
lakeck
User
Beiträge: 25
Registriert: Dienstag 20. April 2004, 16:19

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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
lakeck
User
Beiträge: 25
Registriert: Dienstag 20. April 2004, 16:19

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
digitus
User
Beiträge: 6
Registriert: Donnerstag 6. April 2006, 13:16

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.
Antworten