なぜpython reduce()がなし要素をスキップするのですか?

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

それから私はこれまでに使用したことのない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/'

それはその中にないものを削減するだけですか?結果の説明は何ですか?

ええ、私は知っています このトピック urllibのパーサー関数を使用してそれを行うことができるので、ここで議論がdecade()に焦点を合わせていることを願っています

役に立ちましたか?

解決

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'

他のヒント

ええ、私はこのトピックから、Urllibのパーサー関数を使用してそれを行うことができることを知っているので、ここでdecade()に焦点を当てることを願っています

標準ライブラリに機能がある場合、なぜホイールを再発明したいのかわかりません。私はあなたがあなたの時間を無駄にせず、Pythons Standard Libraryに精通していることを本当にお勧めします 提供される機能を使用します.

とにかく、あなたの質問に戻ります:私が入力するとき: 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