2017-01-26 4 views
-2

모든 조합의 목록에 목록을 변환하기 쉼표로 구분되어 다음과 같이 표시됩니다 :파이썬 우아한 방법은 내가 좋아하는 요소 목록을

[['A', '2', '3', 'Jan'], ['A', '2', '3', 'Feb'] 
['B', '2', '3', 'Jan'], ['B', '2', '3', 'Feb']] 

파이썬의 내장 함수/라이브러리를 사용하여 이것을 달성하는 우아한 방법은 무엇입니까?

+2

지금까지 시도한 적이 있습니까? – wim

+1

밥, 당신이하고 싶은 일을 잘 설명했습니다. 그러나 [SO]는 설명에 근거한 것이 아니라 오히려 질의 응답입니다. 질문 할 질문이 있습니까? –

+0

일부 문자열 분할 및 itertools.permutations? – doctorlove

답변

5

당신은 첫째로 쉼표 ,에 따라 목록의 요소를 분리 한 후 원하는 목록을 가져 itertools.product을 사용할 수 있습니다으로 :

from itertools import product 
x = ['A, B', '2', '3', 'Jan, Feb'] 

new_list = list(product(*[i.split(', ') for i in x])) 

new_list의 내용이 될 것입니다 여기서

[('A', '2', '3', 'Jan'), 
('A', '2', '3', 'Feb'), 
('B', '2', '3', 'Jan'), 
('B', '2', '3', 'Feb')] 

Dan D의 코멘트에 따르면 아래는 중간 목록 V/s 중간 생성기 비교의 timeit 비교입니다 중급 목록 표현은 약간 더 빠릅니다.

mquadri$ python -m timeit "from itertools import product; list(product(*(i.split(', ') for i in ['A, B', '2', '3', 'Jan, Feb'])))" 
100000 loops, best of 3: 4.83 usec per loop 

mquadri$ python -m timeit "from itertools import product; list(product(*[i.split(', ') for i in ['A, B', '2', '3', 'Jan, Feb']]))" 
100000 loops, best of 3: 3.78 usec per loop 
+0

생성자 표현식을 splat :'list (product (* in i) for 'x'))')에 전달하여 쓸모없는 목록을 만들지 않아도됩니다. –

+0

@ Dan. 중간 목록은이 경우 비교적 빠릅니다. 왜냐하면 * product *와 함께 사용되기 위해서는 생성자 표현식이 쓸모가 없다는 것입니다. –

+0

'timeit'을 사용하여 편집 된 대답은 모두 –