Meine kleine Suchmaschiene (Optimierung)

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
Krauzi
User
Beiträge: 77
Registriert: Montag 22. Oktober 2007, 18:06
Kontaktdaten:

So hallo,
ich bin gerade dabei, meine website in python umzuschreiben.
Dazu möchte ich die suchmaschiene mit normalen suchmaschienen regeln ausstatten. Also soll beispielsweise eine suche nach "VisualStudio Image" auch den link für das VisualStudio bringen und nicht jeden Link, der auf ein Image verlinkt.
Momentan splitte ich nach Leerzeichen mit ganz normalen split().
Ich habe jetzt testweise mal einen provisorischen script geschrieben, der mir VisualStudio Image (wenn es in anführungszeichen geschrieben worden ist) in eine Liste als ein einziges element speichert.
Also suche nach "Visual Studio Image" -> ["Visual Studio Image"]
suche nach "Visual Studio" Image -> ["Visual Studio", "Image"]

der script lautet:

Code: Alles auswählen

def query():
	query = raw_input("What are you searching for?\n>")
	if query.find('"') != -1:
		query_list = []
		while query.find('"') != -1:
			query_list.append( query[query.find('"'):query.find('"', query.find('"')+1)+1] )
			query = query.replace( query[query.find('"'):query.find('"', query.find('"')+1)+1], '' )
		query = query.split()
		for q in query:
			if q != '':
				query_list.append(q)
		return query_list
	else:
		query = query.split()
		return query
in c habe ich von nem freund erfahren, dass man da ein strtok() verwenden kann.

Gibts für meinen Script dazu eine ähnliche Python funktion, die mir meinen script optimiert (es geht in erster linie um geschwindigkeit und wenig rechenleistungsverbrauch)?

MfG Krauzi
Krauzi
User
Beiträge: 77
Registriert: Montag 22. Oktober 2007, 18:06
Kontaktdaten:

roflcopter.
es gibt viel einfacher mit split(" ")
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Was ist denn der Unterschied zwischen str.split() und str.split(" ")? ;-)
Krauzi
User
Beiträge: 77
Registriert: Montag 22. Oktober 2007, 18:06
Kontaktdaten:

aaaaaaah, ich hatte es auch schon mit split() versucht, das klappt auch, jedoch gibt es da ein entscheidendes problem:
Wenn ich beispielsweise ("Suche mit Leerzeichen") mit split() splitte (xD), dann kommt raus:
['"Suche', 'mit', 'Leerzeichen"']
Deshalb kann ich es damit vergessen.
Damit kann die split funktion vergessen werden, und ich bin wieder an meiner anfangsfrage:
Kann ich den oben angegebenen Code verkürzen?

@CM: natürlich keiner^^
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Karutzi hat geschrieben:@CM: natürlich keiner^^

Code: Alles auswählen

>>> "a\nb".split()
['a', 'b']
>>> "a\nb".split(" ")
['a\nb']
>>>
so gleich sieht mir das nicht aus
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

vllt:

str.split('" ')
the more they change the more they stay the same
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich halte zwei Sachen auf die Schneller für wenig gelungen:

1.) Wozu der raw_input in dieser Funktion? Ein Parameter wäre hier sinnvoller
2.) Inhherhalb einer Funktion den selben Namen für eine Variable vergeben ist irgend wie unschön - auch wenn man keine Rekursion betreiben will, sieht das merkwürdig und verwirrend aus.

Den Algo habe ich mir so noch nicht angeguckt.
Krauzi
User
Beiträge: 77
Registriert: Montag 22. Oktober 2007, 18:06
Kontaktdaten:

hm raw_input kommt gleich wieder raus, des war nur ne test funktion.
Die endgültige hat dann sowieso parameter
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Code: Alles auswählen

>>> q = 'Some "test string" with "grouped words" in it'.split('"')
>>> words = []
>>> 
>>> for i in xrange(len(q)):
...   if i % 2:
...     words.append(q[i].strip())
...   else:
...     words.extend(filter(None, q[i].split()))
... 
>>> print words
['Some', 'test string', 'with', 'grouped words', 'in', 'it']
Es gibt aber sicher noch bessere Wege. Schließlich ist das ein häufig auftretendes Problem. CVS mit nem Leerzeichen als Trenner sollte so etwas z.B. auch können.
Bottle: Micro Web Framework + Development Blog
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Krauzi hat geschrieben:@CM: natürlich keiner^^

Code: Alles auswählen

re.split(r'\s', string) == string.split()
Krauzi
User
Beiträge: 77
Registriert: Montag 22. Oktober 2007, 18:06
Kontaktdaten:

äääääääähm shit, das blick ich überhaupt net.
Könnte das jemand kurz erklären?

Ich meine das von Defnull

xrange
extend?
filter????
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Krauzi hat geschrieben: xrange
extend?
filter????
Dokumentation ist das Stichwort! Dort wird alles erklärt. (bei extend musst Du unter "6.6.4. Mutable Sequence Types" nachlesen, die beiden anderen sind built-in functions)
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

OffTopic: Ist es eigentlich arrogant, wenn ich mich weigere, 10 Zeilen Code Schnipsel, die ausschließlich buildins enthalten, näher zu erklären?
Bottle: Micro Web Framework + Development Blog
BlackJack

@Defnull: Nö, finde ich nicht arrogant.

Und noch eine Variante von mir:

Code: Alles auswählen

In [3]: import shlex

In [4]: shlex.split('spam "ham eggs" parrot')
Out[4]: ['spam', 'ham eggs', 'parrot']
lunar

Defnull hat geschrieben:OffTopic: Ist es eigentlich arrogant, wenn ich mich weigere, 10 Zeilen Code Schnipsel, die ausschließlich buildins enthalten, näher zu erklären?
Nein, es ist nur elitär, aber das darfst Du Dir erlauben ;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich denke es kommt auch auf den konkreten Thread an. Und dieses Problem sowie der Begleittext implizieren eigentlich, dass sich der OP schon ein wenig im Python Umfeld auskennt. Somit denke ich auch, dass er von alleine auf die Idee hätte kommen können, das in der Doku nachzuschlagen.
Antworten