2012-02-20 2 views
2

나는 홈페이지의 홈페이지를 만들려고했다. 첫째로 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 

그것의 없음을 ommit 없습니다 만 감소되어 내가

'http:/www.mysite.com/' 

있어 이번 결과에 대한 설명은 무엇입니까?

그래, 난 그냥 그것을 할 URLLIB의 파서 기능을 사용할 수 this topic 알고, 그래서 토론

+0

필터를 사용하여 None 요소를 제거하십시오. – 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이 동일하지 않다는 것입니다.

작품을 줄이는 방법을 이해하기위한 유용한 도구입니다 scanlfunctional (http://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 : 문제 없습니다. 또한, 내 업데이 트를 참조 scanl – Marcin

+0

사실, "URL이 균일하지 않습니다"문제가되지 않습니다. 'lambda x, y : x + '/'+ y' 대신 slack이 첫 번째 부분을 제외한 각 부분 이후가 아닌 구성 요소 사이에 위치하도록 'reduce'하는 접근 방식이 "작동"합니다. 물론, 이렇게하면 끝 부분에는 슬래시가 없습니다. –

2

그래, 나는이 주제에서 알) (감소에 초점을 여기에 희망 I 단지 그것을 할 URLLIB의 파서 기능을 사용, 그래서 당신이에 표준 라이브러리에서 함수가있는 경우 바퀴를 재발견하려는 이유

이해가 안 토론 초점) (감소 여기에 희망을 수 그렇게해라. 정말 시간을 낭비하지 말고 파이썬 표준 라이브러리에 익숙해 지도록 제안하고 기능을 사용하면이 제공됩니다.

어쨌든, 다시 질문 : 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임을 알기 때문에, 지금 나는 그 '휠'스 내핏을 사용할 필요가 없을 것이다. –

관련 문제