2017-03-16 1 views
0

임의의 길이의 0과 1의 문자열을 순열 변환하려고합니다. 나는 길이 n의 문자열에 대한 결과가 n=3에 대해 이렇게되도록이 주제에 대한 많은 답을 보았다.파이썬에서, 0과 1의 문자열의 모든 순열을 순서대로 생성하려면 어떻게해야합니까?

000 
001 
010 
011 
100 
101 
110 
111 

그러나 이것은 내가 필요로하는 것이 아닙니다!

000 
100 
010 
001 
110 
101 
011 
111 

길이 4의이은 다음과 같습니다 :

0000 
1000 
0100 
0010 
0001 
1100 
1010 
1001 
0110 
0101 
0011 
1110 
1101 
1011 
0111 
1111 

는 길이가 5의 경우는 다음과 같습니다

00000 
10000 
01000 
00100 
00010 
00001 
11000 
10100 
10010 
10001 
01100 
01010 
01001 
00110 
00101 
00011 
11100 
11010 
11001 
10110 
10101 
10011 
01110 
01101 
01011 
00111 
11110 
11101 
11011 
10111 
01111 
11111 

가 나는 길이 3과 같이해야 기타 ...

방금 ​​f 이것에 대한 알고리즘을 igure, 아무도 나를 도울 수 있습니까?

편집 : 나는이 사이트의 다른 곳에서 답을 찾을 수 있다고 제안했다. 나는 여기에서 새로 왔기 때문에 나는 정확하게 이해하지 못했지만 두 가지 질문에서 봤던 유일한 중복은 단어 순열이었습니다.

답변

0

나를 위해 작동합니다. 그러나 요소를 순서대로 생성하지 않고 먼저 요소를 생성 한 다음 정렬합니다.

n = 5 
i = np.array(np.indices(n * (2,))).reshape(n, -1) 
i[:, np.argsort(i.sum(0)[::-1], kind='mergesort')].T[::-1] 

그것은, 동점시 원래 순서를 유지 하나, 즉 안정된 정렬을 이용하여 이들 숫자의 합으로 진 단어를 정렬한다.

순서대로 단어를 생성하는 용액 itertools

itertools.chain((n*(0,),), (l[0] * (0,) + sum(((1,) + (i-j-1) * (0,) for i, j in zip(l[1:], l[:-1])),()) + (1,) + (n-l[-1]-1)*(0,) for k in range(1,n+1) for l in itertools.combinations(range(n), k))) 

이 사람 K 수 (K = 0 특수 맡았다 및 itertools.chain을 이용하여 미리 결정된다)을 통해 루프로 구성 될 수있다. 각 K 것은 모든 K 요소 서브 세트 리터 세트 '의을 만들 itertools.combinations 사용 {0, 1, ..., N -1}과 이진 워드 집합 각각 변환한다. 이 번역은 l의 각 요소에 하나를 넣고 그 사이에 들어가야하는 0의 수를 계산하여 작동합니다. 선행 및 후행 0은 특수 사례로 이루어져야했습니다.

샘플 출력 : numpy :

# array([[0, 0, 0, 0, 0], [1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], 
     [0, 0, 0, 1, 0], [0, 0, 0, 0, 1], [1, 1, 0, 0, 0], [1, 0, 1, 0, 0], 
     [1, 0, 0, 1, 0], [1, 0, 0, 0, 1], [0, 1, 1, 0, 0], [0, 1, 0, 1, 0], 
     [0, 1, 0, 0, 1], [0, 0, 1, 1, 0], [0, 0, 1, 0, 1], [0, 0, 0, 1, 1], 
     [1, 1, 1, 0, 0], [1, 1, 0, 1, 0], [1, 1, 0, 0, 1], [1, 0, 1, 1, 0], 
     [1, 0, 1, 0, 1], [1, 0, 0, 1, 1], [0, 1, 1, 1, 0], [0, 1, 1, 0, 1], 
     [0, 1, 0, 1, 1], [0, 0, 1, 1, 1], [1, 1, 1, 1, 0], [1, 1, 1, 0, 1], 
     [1, 1, 0, 1, 1], [1, 0, 1, 1, 1], [0, 1, 1, 1, 1], [1, 1, 1, 1, 1]]) 

itertools :

list(_) 
# [(0, 0, 0, 0, 0), (1, 0, 0, 0, 0), (0, 1, 0, 0, 0), (0, 0, 1, 0, 0), (0, 0, 0, 1, 0), (0, 0, 0, 0, 1), 
    (1, 1, 0, 0, 0), (1, 0, 1, 0, 0), (1, 0, 0, 1, 0), (1, 0, 0, 0, 1), (0, 1, 1, 0, 0), (0, 1, 0, 1, 0), 
    (0, 1, 0, 0, 1), (0, 0, 1, 1, 0), (0, 0, 1, 0, 1), (0, 0, 0, 1, 1), (1, 1, 1, 0, 0), (1, 1, 0, 1, 0), 
    (1, 1, 0, 0, 1), (1, 0, 1, 1, 0), (1, 0, 1, 0, 1), (1, 0, 0, 1, 1), (0, 1, 1, 1, 0), (0, 1, 1, 0, 1), 
    (0, 1, 0, 1, 1), (0, 0, 1, 1, 1), (1, 1, 1, 1, 0), (1, 1, 1, 0, 1), (1, 1, 0, 1, 1), (1, 0, 1, 1, 1), 
    (0, 1, 1, 1, 1), (1, 1, 1, 1, 1)] 
+0

너무 감사합니다! 나는 컴퓨터를 다시 가지고있을 때 내일이 첫번째 것을 시도 할 것이다 :) 나는 지금 나의 전화 위에있다. –

+0

itertools 코드를 설명 할 수 있습니까? 나는 n = 40과 k (1, 2) 범위에서 이것을 시도하고있다. 이것은 단지 41 개의 기본적인 벡터를 제공해야하지만, 어떤 이유로 그것은 영원히 필요하다. 최적화 할 수 있습니까? –

+0

@ Perm.Questiin 방금'n = 40, k in range (1, 2)'로 시도해 보았고 랩톱에서 눈 깜빡 일뿐입니다. 결과에리스트를 적용 했습니까?코드를 좀 더 잘 설명 할 수있는 방법을 알아 보겠습니다. –

관련 문제