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

Die Anzahl des Vorkommen eines unbekannten Substrings zählen

Beitragvon lakeck » Freitag 7. April 2006, 16:46

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Die Anzahl des Vorkommen eines unbekannten Substrings zä

Beitragvon gerold » Freitag 7. April 2006, 17:09

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=][['060507xxxx', 3], ['060507xxxx', 3], ['060507xxxx', 3], ['060506xxxx', 2], ['060506xxxx', 2]][/code]
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Freitag 7. April 2006, 17:43

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 !!

Beitragvon lakeck » Freitag 7. April 2006, 18:27

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

Beitragvon digitus » Freitag 7. April 2006, 19:35

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.

Wer ist online?

Mitglieder in diesem Forum: martinjo