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

Zählen, wie viele verschiedene Strings vorkommen

Beitragvon lakeck » Samstag 17. Dezember 2005, 18:12

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

Beitragvon henning » Samstag 17. Dezember 2005, 19:03

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

Beitragvon lakeck » Samstag 17. Dezember 2005, 20:22

Jippie !!

Das haut hin !! Danke !!
joe

Beitragvon joe » Samstag 17. Dezember 2005, 21:19

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

Beitragvon henning » Sonntag 18. Dezember 2005, 11:05

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

Beitragvon mitsuhiko » Sonntag 18. Dezember 2005, 13:11

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

Beitragvon henning » Sonntag 18. Dezember 2005, 13:28

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

Beitragvon tabellar » Sonntag 18. Dezember 2005, 18:43

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

Tabellar
joe

Beitragvon joe » Sonntag 18. Dezember 2005, 19:09

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Montag 19. Dezember 2005, 08:14

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)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
tabellar
User
Beiträge: 186
Registriert: Mittwoch 4. September 2002, 15:28

Beitragvon tabellar » Montag 19. Dezember 2005, 08:33

@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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 19. Dezember 2005, 13:19

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 Modvoice

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]