2012-02-20 11 views
2

私はURLのホームサイトを取得しようとしました。まず、forループを使用して目標を達成しました。私が前に使用したことがなかったなぜpython reduce()はNone要素をスキップしますか?

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

は、それから私は(削減出くわす得ることができます)。だから私はここに、そのショットを取得コードは次のとおりです。

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をOMMITん削減です結果の説明は何でしょうか?

ええ、私はちょうどそれを行うにはurllibはのパーサ機能を使用することができthis topicから知っているので、私は議論が(削減に焦点を当てたことがここに願っています)

+0

None要素を削除するにはfilter()を使うべきです – sherpya

+0

@sherpyaいいえ、None要素を除外するつもりはない、reduce()関数はNone elemntをスキップして結果を 'http: /www.mysite.com/ 'にする必要があります。' http://www.mysite.com/ ' –

+0

'reduce'は何も省略しません。 'None'要素はありません。それはどこに起こったと思いますか? –

答えて

6
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が一様ではないということです。

作品を減らす方法を理解するための便利なツールがあるscanlfunctionalhttp://pypi.python.org/pypi/functional)から:str.joinは少し異なるアルゴリズムを実装

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

注こと:

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' 
+1

それは正確な説明です!ありがとう〜 –

+0

@ user1117789:問題ありません。また、私の更新re scanl – Marcin

+0

を参照してください実際には、 "URLが均一ではない"問題ではありません。 'lambda x、y:x + '/' + y'を代わりに実行すると、最初の部分を除く各部分の後ではなく、コンポーネントの間にスラッシュが配置されるように、' reduce'を用いたアプローチは「機能します」。もちろん、このようにして最後にはスラッシュはありません。 –

2

ええ、私はこのトピックから知っているI

標準ライブラリに関数がある場合、なぜホイールを再作成したいのか分かりません。そうする。私は本当にあなたの時間を無駄にすることをお勧めしますpythons標準ライブラリに慣れて機能を使用してを提供します。

とにかく、戻ってあなたの質問に:I型:my_url.split('/')[:3]私はこれを取得:

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

だからそれにはNone、他の文字列として使用することができますちょうど空の文字列、ありません。そして、これはreduceアルゴリズムのラムダ関数が行うことですが、明らかに文字列を連結するだけです。それは、より読みやすく、簡単に理解できるように私は、あなたがstringsjoinメソッドを使用することをお勧め:

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

あなたはしかし、最後/を自分で追加する必要があります。

+0

Constantiniusに感謝します。私はreduce()を使うことができる機会を見つけようとしています。私はこれを達成するために既にurllibであることを知っているので、私は今、その 'ホイール'のスナッペットを使用する必要はありません。 –

関連する問題