Seite 1 von 1

Zählen, wie viele verschiedene Strings vorkommen

Verfasst: Samstag 17. Dezember 2005, 18:12
von lakeck
Hallo,

ich möchte in einem File die Anzahl von unterschiedlichen
Substrings [0:3] bestimmen.

Gegeben:
100
110
110
110
099
099
200
200

Die Schleife und der Substring sind nicht das Problem, nur wie stelle
ich es an, dass nur "noch nicht gezählte" addiere ??
Ergebis hier wäre: 4 (100,110,099,200)

Thx a lot,
Lakeck

Verfasst: Samstag 17. Dezember 2005, 19:03
von henning
Du kannst z.B. die Strings, die du schon gezählt hast in ein dict packen, also ungefähr so:

Code: Alles auswählen

bekannt = {}
versch_zeilen = 0
for zeile in datei:
  if not zeile in bekannt:
    versch_zeilen += 1
    bekannt[zeile] = True
Alternativ könntest du die if-abfrage auch weglassen und nur für jede zeile bekannt[zeile] = True setzen und die Anzahl der verschiedenen Zeilen mit len(bekannt.keys()) bestimmen.

Verfasst: Samstag 17. Dezember 2005, 20:22
von lakeck
Jippie !!

Das haut hin !! Danke !!

Verfasst: Samstag 17. Dezember 2005, 21:19
von joe
henning hat geschrieben:Du kannst z.B. die Strings, die du schon gezählt hast in ein dict packen, also ungefähr so:.
Wobei die verwendung von set etwas "artgerechter" wäre.
joe

Verfasst: Sonntag 18. Dezember 2005, 11:05
von henning
Stimmt, aber meiner einer hat bis dato noch nicht mit set gearbeitet, weils das noch nicht gab, als ich angefangen habe :-)
Daher denke ich da gerne mal nicht dran.
In nem dict könnte man übrigens nebenbei gleich zählen, wie oft jede Zeile vorkommt...

Verfasst: Sonntag 18. Dezember 2005, 13:11
von mitsuhiko
Warum nicht so?

Code: Alles auswählen

bekannt = []
versch_zeilen = 0
for zeile in datei:
  if not zeile in bekannt:
    versch_zeilen += 1
    bekannt.append(zeile)

Verfasst: Sonntag 18. Dezember 2005, 13:28
von henning
Weil das "in" bei einer Liste lineare Zeit braucht, bei einem dict im Idealfall nur Konstante.

Verfasst: Sonntag 18. Dezember 2005, 18:43
von tabellar
Soll heissen, dass das dict schneller ist? :roll:

Tabellar

Verfasst: Sonntag 18. Dezember 2005, 19:09
von joe
Hi!
tabellar hat geschrieben:Soll heissen, dass das dict schneller ist? :roll:
Zwingend! Wenn nicht, gäbe es ja eigentlich keine daseinsberechtigung für hashtables. Wenn python mit in in einer liste sucht, muss ja nicht selten über die ganze liste iteriert werden. Wenn das tausende werte sind und sich kaum einer wiederholt, ist das schon problematisch. Beim dict wird nur die postition in der tabelle berechnet und das wars im prinzip.
joe

Verfasst: Montag 19. Dezember 2005, 08:14
von jens
Kann ich ja garnicht glauben, aber du hast recht:

Code: Alles auswählen

import time

loops=6000

test_list = []
test_dict = {}

for i in xrange(loops):
    test_list.append(i)
    test_dict[i] = True

print "Dict..."
start_time = time.time()
start_clock = time.clock()
found=0
for i in xrange(loops*2):
    if i in test_dict:
        found+=1

end_time = time.time()
end_clock = time.clock()
print "%.3f %.3f (%s)" % (end_time-start_time, end_clock-start_clock, found)


print "List..."
start_time = time.time()
start_clock = time.clock()
found=0
for i in xrange(loops*2):
    if i in test_list:
        found+=1

end_time = time.time()
end_clock = time.clock()
print "%.3f %.3f (%s)" % (end_time-start_time, end_clock-start_clock, found)
Ausgabe:

Code: Alles auswählen

Dict...
0.015 0.011 (6000)
List...
2.375 2.373 (6000)

Verfasst: Montag 19. Dezember 2005, 08:33
von tabellar
@joe u. jens:

Danke für die Info's und den Test :) ! Bisher dachte ich immer, dass bei
Geschwindigkeitsdingen zuerst das Tupel, dann die Liste und dann das
Dictionary (Hash) kommt.

Vielleicht wäre das ja was für das Python wiki (blackbird?) ein neuer
Themenpunkt: "Python Performance [Tipps und Messungen]"

Tabellar

Verfasst: Montag 19. Dezember 2005, 13:19
von Leonidas
jens hat geschrieben:Kann ich ja garnicht glauben, aber du hast recht:
Dafür gibts übrigens das Modul timeit.