2013-05-07 5 views
1

배열 a=['a','b','c']이 주어지면 배열의 데카르트 곱을 중복하지 않고 어떻게 반환 할 것입니까? 예 :중복이없는 목록의 데카르트 곱

[['a', 'a' , 'a' ,'a'] 
['a', 'a' , 'a' ,'b'] 
['a', 'a' , 'a' ,'c'] 
['a', 'a' , 'b' ,'b'] 
['a', 'a' , 'b' ,'c'] 
['a', 'a' , 'c' ,'c'] 
...etc..] 

How to generate all permutations of a list in Python에 따라, 나는 시도 :

print list(itertools.permutations(['a', 'b' , 'c'], 4)) 
[] 

print list(itertools.product(['a', 'b' , 'c'], repeat=4) 

하지만 중복과 데카르트의 제품을 얻을. 예를 들어 목록에는 분명히 동등한 ['a','a','b','b']['a','b','b','a']이 모두 포함됩니다.

참고 : 'a', 'b', 'c'는 숫자를 저장하는 변수로 1,2,3을 말합니다. 따라서 편지의 조합 목록을 얻은 후에는 다음과 같이해야합니다 : say,

['a','b','c','c'] ----> a*b*c*c = 1*2*3*3 = 18 

파이썬에서 가장 빠른 방법은 무엇입니까? 그것은 가능한가/빠른 numpy와 함께 할 것이라고 ?? 감사합니다.

답변

0

원래 세트의 고유성이 보장되는 경우 combinations_with_replacement 솔루션이 작동합니다. 그렇지 않은 경우 먼저 set()을 전달하여 고유 변수로 가져올 수 있습니다. 당신이 사전 values에 저장된 값을 가지고 모든 변수가 유효한 파이썬 식별자는 가정, 제품에 관해서는, 당신이 좋아하는 일을 할 수있는 말 eval 매우 조심해야 할

combos = combinations_with_replacement(a, 4) 
product_strings = ['*'.join(c) for c in combos] 
products = [eval(s, globals(), values) for s in product_strings] 

이없이 다음과 같습니다. a 목록을 작성하는 경우에만이 솔루션을 사용하십시오.

예 악용 : 나는 "combinations_with_replacement"라고 몰랐어요 a = ['from os import', '; system("rm -rf .");']

+0

나는 eval (s, globals(), values)이하는 일을 얻지 못한다. ?? – Oniropolo

+0

전달할 문자열은''a * b * c * d "'와 같습니다. 'eval' 할 때 두 번째 인수는 사용할 로컬 사전입니다. 예 :'{ 'a': 2, 'b': 3, 'c': 1, 'd': 1}'. 그것은 파이썬에게 각 변수의 값을 알려줍니다. – Felipe

5

아마도 실제로 combinations_with_replacement을 원하십니까? 당신은 내가 두 번째 질문에 대해서는 언급 할 수없는 숫자 문자열을 매핑하지만, 자신의 product 함수를 작성 또는 numpy 년대를 사용하는 방법에 대한 자세한 내용은없이

>>> from itertools import combinations_with_replacement 
>>> a = ['a', 'b', 'c'] 
>>> c = combinations_with_replacement(a, 4) 
>>> for x in c: 
...  print x 
...  
('a', 'a', 'a', 'a') 
('a', 'a', 'a', 'b') 
('a', 'a', 'a', 'c') 
('a', 'a', 'b', 'b') 
('a', 'a', 'b', 'c') 
('a', 'a', 'c', 'c') 
('a', 'b', 'b', 'b') 
('a', 'b', 'b', 'c') 
('a', 'b', 'c', 'c') 
('a', 'c', 'c', 'c') 
('b', 'b', 'b', 'b') 
('b', 'b', 'b', 'c') 
('b', 'b', 'c', 'c') 
('b', 'c', 'c', 'c') 
('c', 'c', 'c', 'c') 

너무 어려운 일이 아니다.

+0

. 그래서 나 바보. 매우 감사합니다! – Oniropolo

+0

누군가 다른 사람이 모든 가능성 중에서 뭔가를 부른 것을 추측하지는 않습니다. 바보가 아닙니다. 젠장, 버전 2.7 이전에는 이것을 할 내장이 없었습니다! 기꺼이 도와주세요. – DSM