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.