Почему Python уменьшает () пропустить элемент «нет»?

StackOverflow https://stackoverflow.com/questions/9359677

  •  28-10-2019
  •  | 
  •  

Вопрос

Я попытался получить домашний сайт URL. Во -первых, я использовал для цикла и достигнут цели.

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

Тогда я сталкиваюсь с REMUT (), который никогда раньше не использовал. Итак, я получаю это, вот код:

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

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

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

Это было полезно?

Решение

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 -адреса не являются однородными, поскольку протокол разделен с двойной чертой.

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

Другие советы

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

Я не понимаю, почему вы хотите заново изобрести колесо, если в стандартной библиотеке есть функция. Я действительно предлагаю вам не тратить свое время и познакомиться со стандартной библиотекой 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'

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top