2012-04-22 3 views
0

각 요소가 0과 K 포함 ([0, K]) 사이의 정수인 차원 N의 모든 벡터 집합을 만드는 우아한 방법은 무엇입니까?파이썬, 벡터를 만드는 우아한 방법

내 현재 코드는 다음과 같습니다

def nodes_init(n, k): 
    nodes = {} 
    e = np.identity(n) 
    nodes[tuple(np.zeros(n))] = 0 
    s = Set() 
    s.add(tuple(np.zeros(n))) 
    s_used = Set() 
    while len(s) != 0: 
     node = s.pop() 
     if node in s_used: 
      continue 
     s_used.add(node) 
     for i in xrange(len(e)): 
      temp = node + e[i] 
      temp = cap(temp, k) 
      temp = tuple(temp) 
      nodes[temp] = 0 
      if not temp in s_used: 
       s.add(temp) 
    return nodes 

def cap(t, k): 
    for i in xrange(len(t)): 
     if t[i] > k: 
      t[i] = k 
    return t 

나는 그것을 좋아하지 않는다. 사전 nodes의 키가 원하는 벡터입니다.

+0

, 왜 당신이 원하는 것? K^N 벡터로 끝나지 않을까요? (많이) – Shep

+0

나는 나무와 놀고있다. 내 경우에는 n과 k가별로 없기 때문에 컴퓨터가 처리 할 수있다. – ashim

답변

2

사용 itertools

from itertools import product 

def nodes_iter(n, k): 
    """ returns generator (lazy iterator) rather than creating whole list """ 
    return product(range(k+1),repeat=n) 

사용 예제 :

는 호기심
for node in nodes_iter(3,1): 
    print node 


(0, 0, 0) 
(0, 0, 1) 
(0, 1, 0) 
(0, 1, 1) 
(1, 0, 0) 
(1, 0, 1) 
(1, 1, 0) 
(1, 1, 1) 
+0

'product'는 키워드 인수'repeat'를 취한다. 그래서,'product (range (k + 1), repeat = n)'이 할 것입니다. 그리고 'k'는 포괄적이라는 점에 유의하십시오. 그러므로'range (k) '대신'range (k + 1)'을 사용하십시오. – Avaris

+0

나는 Avaris의 의견에 따라 (그리고 콘솔에서 테스트 한 후에) 대답을 편집 할 자유를 가졌습니다. –

+0

@ 로베르토 : 편집 해 주셔서 감사합니다. 그러나 동시에 편집하고 있습니다. – vartec

관련 문제