2013-04-16 1 views
4

때때로 나는 더 좋은 문자열로 대체하고 싶다고 생각하는 문자열이 있습니다. functools 및 itertools로 놀았으며 문제에이 문제를 적용 해보고 싶지만 조금 붙어 있습니다. 여기에 내가 가진 무엇 :itertools 또는 functools에 대한 python의 찾기 - 바꾸기 목록

s1 = 'how to sing songs' 
s2 = 'This is junk' 
s3 = "This is gold" 
s4 = 'HTML' 
s5 = 'html' 
s6 = 'i' 
mylist = [s1,s2,s3,s4,s5,s6] 

replacements = [('html','HTML'),('how to sing songs','singing'),('This is junk', ''),('i','')] 

내가 일종의라는 기능 알고리즘을하고 싶습니다, myList에 각각의 문자열을, 교환에서 각 교체하려면 string.replace 위해 (교체 [0], 교체 [1]) . 마음에 와서 어떤 종류의

는 ... 같은

map(lambda x,y: x.replace(y[0],y[1]),mylist,replacements) 
map(partial(lambda x,y: x.replace(y[0],y[1]),mylist),replacements) 

것이었다 그러나 첫 번째는 여분의 인수를 원하고, 두 번째는 목록 개체가 어떤 속성이 대체가 없습니다 말했다. 이것을 해결할 수있는 매끄러운 기능적 방법이 있습니까? 대신에 지능형리스트의 map()

답변

4
>>> [reduce(lambda x, y: x.replace(y[0], y[1]), replacements, s) for s in mylist] 
['singing', '', 'This is gold', 'HTML', 'HTML'] 

동등한 코드 : 당신이 정말 빨리 뭔가를 원하는 것처럼

map(partial(reduce, lambda x, y: x.replace(y[0], y[1]), replacements), mylist) 
+0

덕분에, 그게 내가 바라던 정확히입니다. 그러나 필자는 교체 목록에 'e'와 같은 짧은 단어가 있으면 단어 내에서 바뀝니다. 전체 단어 만 바꾸려면 어떻게 수정해야합니까? regexp로 바뀌 었습니까? – Mittenchops

+0

그래, 아마 정규식으로 할 필요가있을 것이다. –

+0

멋지다, 나는 이것이 효과가 있다고 생각한다.'map (partial, reduce, lambda x, y : re (r '\ b % s \ b'% y [0], y [1], x) mylist)' – Mittenchops

-1

는 소리. 이 경우 조회는 매우 빠르기 때문에 실제로 사전을 사용해야합니다.

동작하는 예제 :

mylist = ['how to sing songs', 'This is junk', "This is gold", 'HTML', 'html', 'i'] 
replacements = {'html':'HTML', 'how to sing songs':'singing', 'This is junk':'', 'i':''} 

print [replacements.get(word, word) for word in mylist] 
# ['singing', '', 'This is gold', 'HTML', 'HTML', ''] 
+0

소리가 좋습니다. 당신이 어떻게 의미하는지 예를 들어 주시겠습니까? – Mittenchops

+0

@DaveTheScientist 잘못된 질문입니다. – jamylak

+0

어떻게 잘못 되었나요? 그것은 FJ의 답변과 똑같은 산출물을 산출합니다. 또한 훨씬 더 깨끗하며 훨씬 빨라야합니다. 내 대답을 편집하여 출력물을 보여줍니다. – DaveTheScientist