Question

J'ai essayé de le site d'accueil d'un URL. Tout d'abord j'ai utilisé une boucle et atteindre l'objectif.

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

et je peux obtenir

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

Alors je viens à travers réduire () que je ne l'avais jamais utilisé auparavant. Donc, je reçois un coup de feu, voici le 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

cette fois, je suis

'http:/www.mysite.com/'

Est-il juste de réduire OMMISSIONS le Néant il? Quelle est l'explication du résultat?

ouais, je sais de ce sujet que je pourrait simplement utiliser la fonction analyseur de urllib de le faire, je l'espère ici la discussion se concentre sur la réduction ()

Était-ce utile?

La solution

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/'

Ce n'est pas mystérieuse. Tout fonctionne comme prévu -. Le problème est que les URL ne sont pas uniformes, en ce que le protocole est séparé par une double barre oblique

Un outil utile pour comprendre comment réduire les travaux est scanl de functional ( http://pypi.python.org / pypi / fonctionnel):

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/']

Notez que str.join implémente un algorithme légèrement différent:

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

est ce que les gens veulent en général - il est équivalent à:

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

Autres conseils

ouais, je sais de ce sujet que je pouvais utiliser la fonction analyseur de urllib de le faire, je l'espère ici l'accent de discussion sur la réduction ()

Je ne comprends pas pourquoi vous voulez réinventer la roue s'il y a une fonction dans la bibliothèque standard pour le faire. Je suggère vraiment que vous ne perdez pas votre temps et vous familiariser avec pythons bibliothèque standard et utiliser la fonctionnalité fournie .

Quoi qu'il en soit, revenir à votre question: Quand je tape: my_url.split('/')[:3] je reçois ceci:

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

Donc il n'y a pas None dedans, juste une chaîne vide, qui peut être utilisé comme toute autre chaîne. Et apparemment, c'est ce que votre fonction lambda pour l'algorithme de reduce fait, il concaténer juste les cordes ensemble. Je vous suggère d'utiliser la méthode strings de join, car il est plus lisible et facile à comprendre:

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

Vous devez ajouter la dernière / vous, cependant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top