Почему python limit () пропускает элемент None? - PullRequest
2 голосов
/ 20 февраля 2012

Я пытался получить домашний сайт URL.Сначала я использовал цикл for и достиг цели.

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

, и я могу получить

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

Затем я сталкиваюсь с функцией Reduce (), которую никогда раньше не использовал.Итак, я попробую, вот код:

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

на этот раз я получил

'http:/www.mysite.com/'

Это уменьшить, просто опустить None в нем? Какое объяснение результата?

да, я знаю из этой темы , что я мог бы просто использовать для этого функцию парсера urllib, поэтому я надеюсь, что здесь обсуждение будет сосредоточено на redu ()

Ответы [ 2 ]

6 голосов
/ 20 февраля 2012
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/'

Это не таинственно.Все работает, как и ожидалось - проблема в том, что URL-адреса не являются единообразными, поскольку протокол разделяется двойной косой чертой.

Полезный инструмент для понимания того, как работает Reduce, равен scanl из 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/']

Обратите внимание, что str.join реализует несколько иной алгоритм:

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

Это то, что люди обычно хотят - это эквивалентно:

In [22]: reduce(lambda x,y : '%s/%s'%(x,y),my_url.split('/'))
Out[22]: 'http://www.mysite.com/subdir/subdir2/index.html'
2 голосов
/ 20 февраля 2012

да, я знаю из этой темы, что я мог бы просто использовать функцию парсера urllib, чтобы сделать это, поэтому я надеюсь, что здесь обсуждение сосредоточится на redu ()

Я не понимаю, зачем вам изобретать велосипед, если в стандартной библиотеке есть функция для этого. Я действительно предлагаю вам не тратить свое время и ознакомиться со стандартной библиотекой pythons и использовать предоставляемые функции .

В любом случае, вернемся к вашему вопросу: Когда я набираю: my_url.split('/')[:3], я получаю это:

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

Так что в нем нет None, просто пустая строка, которую можно использовать как любую другую строку. И, очевидно, это то, что делает ваша лямбда-функция для алгоритма reduce, она просто объединяет строки обратно. Я предлагаю вам использовать метод strings join, так как он более читабелен и понятен:

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

Вы должны добавить последний / самостоятельно, хотя.

...