Pourquoi python réduire () sauter par-dessus l'élément Aucun?
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 ()
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.