Frage

Ich habe versucht, die Heimstelle einer URL zu bekommen. Zunächst habe ich eine für Schleife verwendet und das Ziel erreicht.

home = ''
my_url = 'http://www.mysite.com/subdir/subdir2/index.html'
for item in my_url.split('/')[:3]:
    home += item + '/'
print  home

Und ich kann bekommen

'http://www.mysite.com/' 

Dann stoße ich auf recly (), was ich noch nie zuvor benutzt hatte. Also bekomme ich es einen Schuss, hier ist der Code:

my_url = 'http://www.mysite.com/subdir/subdir2/index.html'
home = ''
home = reduce(lambda x,y : x + y + '/',my_url.split('/')[:3])
print home

Diesmal bekam ich

'http:/www.mysite.com/'

Ist es nur so reduziert, dass keiner darin ist? Was ist die Erklärung für das Ergebnis?

Ja, ich weiß von dieses Thema Dass ich nur Urllibs Parser -Funktion verwenden könnte, ich hoffe, hier konzentriert sich die Diskussion auf die Reduzierung ()

War es hilfreich?

Lösung

my_url = 'http://www.mysite.com/subdir/subdir2/index.html'
home = ''
home = reduce(lambda x,y : x + y + '/',my_url.split('/')[:3])

my_url.split('/')[:3] #=> ['http:', '', 'www.mysite.com']

'http:' + '' + '/' #=> 'http:/'
'http:/' + 'www.mysite.com' + '/' #=> 'http:/www.mysite.com/'

Das ist nicht mysteriös. Alles funktioniert wie erwartet - das Problem ist, dass URLs nicht einheitlich sind, da das Protokoll mit einem doppelten Schrägstrich getrennt ist.

Ein nützliches Instrument zum Verständnis, wie reduziert wird, ist scanl aus functional ( http://pypi.python.org/pypi/functional ):

In [11]: home = scanl(lambda x,y : '%s%s/'%(x,y),my_url.split('/')[0],my_url.split('/')[1:3])

In [12]: home
Out[12]: <generator object _scanl at 0x0000000003DEC828>

In [13]: list(home)
Out[13]: ['http:', 'http:/', 'http:/www.mysite.com/']

Beachten Sie, dass str.join Implementiert einen etwas anderen Algorithmus:

In [16]: '/'.join(my_url.split('/'))
Out[16]: 'http://www.mysite.com/subdir/subdir2/index.html'

Dies ist es, was die Leute normalerweise wollen - es entspricht:

In [22]: reduce(lambda x,y : '%s/%s'%(x,y),my_url.split('/'))
Out[22]: 'http://www.mysite.com/subdir/subdir2/index.html'

Andere Tipps

Ja, ich weiß aus diesem Thema, dass ich nur Urllibs Parser -Funktion verwenden könnte, also hoffe ich, dass hier die Diskussion auf die Reduzierung liegt ()

Ich verstehe nicht, warum Sie das Rad neu erfinden möchten, wenn es in der Standardbibliothek eine Funktion gibt. Ich empfehle Ihnen wirklich, Ihre Zeit nicht zu verschwenden und sich mit der Pythons Standard Library vertraut zu machen und Verwenden Sie die bereitgestellte Funktionalität.

Wie auch immer, zurück zu Ihrer Frage: Wenn ich tippe: my_url.split('/')[:3] Ich verstehe das:

['http:', '', 'www.mysite.com']

Es gibt also keine None Darin nur eine leere Zeichenfolge, die als jede andere Zeichenfolge verwendet werden kann. Und anscheinend ist dies das, was Ihre Lambda für die Funktion reduce Algorithmus tut es nur zusammen, damit die Saiten wieder zusammen sind. Ich schlage vor, Sie verwenden die strings join Methode, da sie lesbarer und einfacher verständlicher ist:

>>> parts = my_url.split('/')[:3]
>>> print "/".join(parts)
'http://www.mysite.com'

Sie müssen den letzten anhängen / Sie selbst.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top