| |  | CATIA V5 Grundkurs | Einsteiger - 5 Std. 15 Min 48 | | |  | KISTERS 3DViewStation mit neuer Zerschneidefunktionen und erweitertem PMI-Support, eine Pressemitteilung
|
Autor
|
Thema: Python: Ideen für schnelles Listensuchen? (4155 mal gelesen)
|
HerrHansen Mitglied Dipl.-Ing.
 
 Beiträge: 257 Registriert: 03.12.2005 Abaqus/CAE 6.3 bis 6.12
|
erstellt am: 30. Apr. 2010 16:26 <-- editieren / zitieren --> Unities abgeben:         
Hallo allerseits, ich möchte eine Datei einlesen und diese auf das Vorhandensein bestimmter Wörter prüfen. Da die Datei locker 8 Mio. Zeilen haben kann, dauert der "handelsübliche" Weg sehr lange: Code:
datei=open('testdatei.txt','r') lines=datei.readlines()for i in lines: if i.__contains__('drei'): print 'das Wort drei wurde gefunden'
Also habe ich mir gedacht, verwende ich lieber ein dictionary ohne ewige for-Schleife und if-schleife: Code:
datei=open('testdatei.txt','r') lines=datei.readlines()d=dict(zip(xrange(len(lines)),lines)) print d
Aber Nr.1: die Ausgabe des obigen Code-Fragments ist
Code:
{0: 'eins\n', 1: 'zwei\n', 2: 'drei\n', 3: 'vierhundert\n', 4: 'achtmillionen \n', 5: 'drei'}
Das heißt, es werden (natürlich) die Whitespaces mit eingelesen. Hat jemand eine Idee, wie ich ohne irgendwelche Schleifen diese Whitespaces beim einlesen entfernen kann?Aber Nr.2: Wie kann ich in der oben erzeugten Liste ohne Schleife nach dem Wert "drei" suchen und die Indexposition ausgeben? Die Funktionen get und has_key scheitern daran, dass sie nach den Keys und nicht nach den zugeordneten Werten suchen. Ich habe zum Testen die Datei testdatei.txt angehangen. Ich freue mich über jeden Hinweis. Viele Grüße HH Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MalteJ Mitglied Junior-Aerodynamiker, TUMling
 
 Beiträge: 101 Registriert: 18.08.2000
|
erstellt am: 01. Mai. 2010 15:40 <-- editieren / zitieren --> Unities abgeben:          Nur für HerrHansen
|
Jeremy Mitglied
 
 Beiträge: 129 Registriert: 04.02.2009
|
erstellt am: 03. Mai. 2010 09:33 <-- editieren / zitieren --> Unities abgeben:          Nur für HerrHansen
Hallo Herr Hansen, die whitespaces können mit der Funktion str.strip() [mit lstrip() kannman Zeichen links löschen, mit rstrip() Zeichen rechts des Strings] gelöscht werden oder auch andere Zeichen, siehe: http://docs.python.org/library/stdtypes.html?highlight=.split#str.strip Das müsste dann gleich beim Einlesen passieren, ungefähr so (nicht getestet):
Code:
d=dict(zip(xrange(len(lines)),str(lines).strip()))
Zum schnellen Einlesen eine Datei mit so vielen Zeilen empfehle ich dir diese Frage im Python-Foum zustellen - www.python-forum.de , vielleicht habe sie dort auch ein "Runumpaket" für dein Problem. Eine Möglichkeit um die 'drei' zufinden: wandele das Dictionary mit "d.values()" in eine Liste um, die nur aus den Werten des dict besteht. In dieser Liste kannst du dann mit
Code:
'drei' in d.values()
nach demm Wort 'drei' suchen. Wie oben gesagt, erhält man mit d.values().index('drei') die Position in dieser Liste und mit d.values().count('drei') wie oft das Wort 'drei' vorkommt.Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HerrHansen Mitglied Dipl.-Ing.
 
 Beiträge: 257 Registriert: 03.12.2005 Abaqus/CAE 6.3 bis 6.12
|
erstellt am: 03. Mai. 2010 17:22 <-- editieren / zitieren --> Unities abgeben:         
Hallo Allerseits, ja, die Geschichte mit str(lines) funktioniert in diesem Fall leider nicht, weil ich mit zip und xrange das dictionary aufbaue (oder ich stell mich zu doof an ). Die Ausgabe von:
Code: d=dict(zip(str(lines).strip(),xrange(len(lines))))
ergibt nämlich das hier:
Code: {'e': 2, "'": 1, 'i': 3, 'n': 4, 's': 5, '[': 0}
Aber der Hinweis mit der Umwandlung in eine Liste und dann über index zu suchen war hilfreich. Das ist eine vernünftige Lösung. Vielen Dank für die Antworten. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
 |