Zählen, wie viele verschiedene Strings vorkommen

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,

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
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

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

Jippie !!

Das haut hin !! Danke !!
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
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

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...
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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)
TUFKAB – the user formerly known as blackbird
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Weil das "in" bei einer Liste lineare Zeit braucht, bei einem dict im Idealfall nur Konstante.
tabellar
User
Beiträge: 186
Registriert: Mittwoch 4. September 2002, 15:28

Soll heissen, dass das dict schneller ist? :roll:

Tabellar
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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
tabellar
User
Beiträge: 186
Registriert: Mittwoch 4. September 2002, 15:28

@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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

jens hat geschrieben:Kann ich ja garnicht glauben, aber du hast recht:
Dafür gibts übrigens das Modul timeit.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten