2014-09-12 4 views
2

저는 파이썬을 처음 접했고 다음과 같은 사실을 알아 냈습니다.두리스트의 파이썬 곱셈

>>> 'D'*1 
'D' 

따라서 나는 우리가 곱셈을하고 문자열을 결합 할 수 있는지 여부를 궁금해

>>> print(choice) 
[1, 1, 1, 1] 
>>> print(A) 
['D', 'e', '0', '}'] 

내 원하는 출력이 될 것이다 (선택에 대 한 요소는 0 또는 1 만 가능) 'De0}'

+0

'choice = [1,1,1,2]'이면 무엇이 인쇄됩니까? – Ffisegydd

+0

다른 문제가 있습니다. 내 scenrio 나는 그 사용자가 확인란을 가지고 싶습니다. 항목이 선택되면 1, 그렇지 않으면 0입니다. 따라서이 경우에만 0 또는 1입니다. – useR

+0

@useR :이 경우에는 여기에 곱할 필요가 없습니다. 그냥 '압축'을 사용하십시오; 요소를 선택하거나 '선택'에있는 요소의 진리 값에 따라 무시하십시오. –

답변

7

당신이 할 수있는 explicity 목록을 mulitply 지퍼에 넣은 다음 결과에 합치십시오.

''.join([c * i for c, i in zip(A, choice)]) 

zip() functionA의 문자를 choice의 정수와 쌍을 이루고, 목록 내포는 그 문자를 정수에 곱합니다. str.join() call은 그 결과를 하나의 문자열로 결합합니다. 기초하여 상기 제 반복자에서 선택 요소 : 당신이하고자했다 정확하게 수행

from itertools import compress 

''.join(compress(A, choice)) 

compress()을 :

choice하는 경우가 그냥 에 사용 요소를 선택 사용, 여기 itertools.compress()를 사용하여 더 나은 두 번째 iterable의 해당 값은 true 또는 false입니다.

데모 : itertools.compress()를 사용

>>> choice = [1, 1, 1, 1] 
>>> A = ['D', 'e', '0', '}'] 
>>> ''.join([c * i for c, i in zip(A, choice)]) 
'De0}' 
>>> choice = [0, 1, 0, 1] 
>>> ''.join([c * i for c, i in zip(A, choice)]) 
'e}' 
>>> from itertools import compress 
>>> ''.join(compress(A, choice)) 
'e}' 

입니다 훨씬 빨리 여기 옵션 :

4 배 속도 증가의
>>> import timeit 
>>> import random 
>>> A = [chr(random.randrange(33, 127)) for _ in range(1000)] 
>>> choice = [random.randrange(2) for _ in range(1000)] 
>>> def with_mult(A, choice): 
...  return ''.join([c * i for c, i in zip(A, choice)]) 
... 
>>> def with_compress(A, choice): 
...  return ''.join(compress(A, choice)) 
... 
>>> timeit.timeit('f(A, choice)', 'from __main__ import A, choice, with_mult as f', number=10000) 
1.0436905510141514 
>>> timeit.timeit('f(A, choice)', 'from __main__ import A, choice, with_compress as f', number=10000) 
0.2727453340048669 

.

+0

물론 우리는 생성기 표현식으로도 할 수 있습니다. '' '.join (c는 i, zip은 ('De0) ', [1, 1, 1, 0])' –

+0

@ PM2Ring 'str.join'을 사용할 때 생성자 표현식과 대조적으로리스트 이해력을 사용하는 것이 더 좋은 이유에 대해서는 http://stackoverflow.com/a/9061024/3005188을 참조하십시오. – Ffisegydd

+0

@ PM2Ring :하지만 'str.'str.join()'은 두개의 스캔을하는리스트 객체를 가져야하기 때문에 join()'call *은 더 느립니다. 하나는 총 크기를 결정하기위한 것이고, 하나는 실제 문자열을 만드는 것입니다. –

5

str.joinzip과 함께 list comprehension을 사용할 수 있습니다. 예를 들어 아래를 참조하십시오 :

choice = [1, 1, 1, 0] 
A = ['D', 'e', '0', '}'] 

out = ''.join([n*c for n, c in zip(choice, A)]) 

print(out) 
# De0 

를 선택의 4 요소가 인쇄되지 않습니다 A ('}')의 4 요소가 0이기 때문에.