为什么python reduce()会跳过None元素?

时间:2012-02-20 10:33:41

标签: python reduce

我试图获取网址的主页。首先,我使用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/'

是否减少只是忽略其中的“无”?结果的解释是什么?

是的,我从this topic知道我可以使用urllib的解析器函数来完成它,所以我希望在这里讨论的重点是reduce()

2 个答案:

答案 0 :(得分: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不统一,因为协议用双斜杠分隔。

scanlhttp://pypi.python.org/pypi/functionalfunctional 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'

这是人们通常想要的 - 它相当于:

{{1}}

答案 1 :(得分:2)

  

是的,我从这个话题中知道我可以使用urllib的解析器函数来完成它,所以我希望这里的讨论集中在reduce()

如果标准库中有一个功能,我不明白你为什么要重新发明轮子。我真的建议你不要浪费你的时间,熟悉pythons标准库,使用提供的功能

无论如何,回到你的问题:当我输入:my_url.split('/')[:3]时,我明白了:

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

因此其中没有None,只是一个空字符串,可以用作任何其他字符串。显然这就是你的reduce算法的lambda函数所做的,它只是将字符串连接在一起。我建议您使用strings join方法,因为它更易读且易于理解:

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

但你必须亲自追加/