Seite 1 von 1

Meine kleine Suchmaschiene (Optimierung)

Verfasst: Mittwoch 18. November 2009, 11:42
von Krauzi
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

Verfasst: Mittwoch 18. November 2009, 12:10
von Krauzi
roflcopter.
es gibt viel einfacher mit split(" ")

Verfasst: Mittwoch 18. November 2009, 12:12
von CM
Was ist denn der Unterschied zwischen str.split() und str.split(" ")? ;-)

Verfasst: Mittwoch 18. November 2009, 12:54
von Krauzi
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^^

Verfasst: Mittwoch 18. November 2009, 12:58
von jbs
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

Verfasst: Mittwoch 18. November 2009, 12:59
von Dav1d
vllt:

str.split('" ')

Verfasst: Mittwoch 18. November 2009, 12:59
von Hyperion
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.

Verfasst: Mittwoch 18. November 2009, 13:17
von Krauzi
hm raw_input kommt gleich wieder raus, des war nur ne test funktion.
Die endgültige hat dann sowieso parameter

Verfasst: Mittwoch 18. November 2009, 13:32
von Defnull

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.

Verfasst: Mittwoch 18. November 2009, 13:44
von CM
Krauzi hat geschrieben:@CM: natürlich keiner^^

Code: Alles auswählen

re.split(r'\s', string) == string.split()

Verfasst: Mittwoch 18. November 2009, 13:49
von Krauzi
äääääääähm shit, das blick ich überhaupt net.
Könnte das jemand kurz erklären?

Ich meine das von Defnull

xrange
extend?
filter????

Verfasst: Mittwoch 18. November 2009, 13:57
von Hyperion
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)

Verfasst: Mittwoch 18. November 2009, 15:18
von Defnull
OffTopic: Ist es eigentlich arrogant, wenn ich mich weigere, 10 Zeilen Code Schnipsel, die ausschließlich buildins enthalten, näher zu erklären?

Verfasst: Mittwoch 18. November 2009, 19:04
von 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']

Verfasst: Mittwoch 18. November 2009, 19:24
von 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 ;)

Verfasst: Mittwoch 18. November 2009, 19:26
von Hyperion
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.