문제

나는 일련의 4 개의 문자 문자열을 통해 루프하는 스크립트가 있습니다. 예를 들어:

aaaa
aaab
aaac
aaad

같은 루프를 위해 중첩으로 구현할 수 있다면 :

chars = string.digits + string.uppercase + string.lowercase

for a in chars:
    print '%s' % a   
    for b in chars:
        print '%s%s' % (a, b)
        for c in chars:
            print '%s%s%s' % (a, b, c)
            for d in chars:
                print '%s%s%s%s' % (a, b, c, d)

이런 종류의 루프가 나쁜 일을 하는가, 그렇다면 내가하고있는 일을 성취하는 더 나은 방법은 무엇입니까?

도움이 되었습니까?

해결책

import string
import itertools

chars = string.digits + string.letters
MAX_CHARS = 4
for nletters in range(MAX_CHARS):
    for word in itertools.product(chars, repeat=nletters + 1):
        print (''.join(word))

그것은 모두 인쇄 할 것입니다 15018570 당신이 찾고있는 단어. 더 많거나 적은 단어를 원한다면 MAX_CHARS 변하기 쉬운. 여전히 두 개만있을 것입니다 for숯이 많고 스스로 반복 할 필요가 없습니다. 그리고 꽤 읽을 수 있습니다. .

다른 팁

나는 내 대답을 가장 읽기 쉽고 가장 확장 가능하다고 제출할 것입니다 :)

import string
chars = [''] + list(string.lowercase)

strings = (a+b+c+d for a in chars
                   for b in chars
                   for c in chars
                   for d in chars)

for string in strings:
    print string

편집 : 실제로, 이것은 길이 <4의 모든 문자열의 복제물을 생성하기 때문에 올바르지 않습니다. 에서 빈 문자열을 제거합니다 chars 배열은 단지 4 char 문자열을 생성합니다.

일반적으로 나는이 답을 삭제하지만 같은 길이의 문자열을 생성 해야하는 경우에도 여전히 좋아합니다.

프로그래머를 먼저 작성하십시오 - 컴퓨터 두 번째.
이해하는 것이 명확하고 명백하다면 정확히 맞습니다.

속도가 중요하고 컴파일러가 어쨌든 최적화되지 않으면 측정하고 문제가되는 경우 더 빨리 영리한 방법을 생각하십시오!

당신이 이해한다면, 나는 그것이 나쁜 일이라고 생각하지 않습니다. 나는 더 피스닉 방식이나 영리한 솔루션 (람다 또는 뭐지)가 있을지도 모른다는 것은 의심의 여지가 없지만 항상 영리성보다 가독성을 선호했습니다.

1-, 2, 3- 및 4 자 "단어"의 모든 가능성을 생성해야 하므로이 방법은 어느 것보다 좋습니다. 1,400 만 줄의 출력을 효과적으로 생성하기 때문에 얼마나 오래 걸릴지 잘 모르겠습니다 (아마도 모든 솔루션은 그 문제가있을 것입니다).

사전 계산하면 일반적인 접두사가 속도 부스트를 제공 할 수 있지만 확인하는 것이 좋습니다 (확인하는 것이 좋습니다)언제나 확인하다, 절대 추정하다):

chars = string.digits + string.uppercase + string.lowercase
for a in chars:
    print a
    for b in chars:
        ab = '%s%s' % (a, b)
        print ab
        for c in chars:
            abc = '%s%s' % (ab, c)
            print abc
            for d in chars:
                print '%s%s' % (abc, d)

편집 : 실제로 일부 벤치 마크를 수행했습니다 (Wind 나는 그것이 그 사용을 보증 할 수 있다고 생각합니다 (다시 한 번, 달성하려는 것을 명확하게 기록하는 한).

@nosklo 's 그리고 @Triptych 's 솔루션은 다른 결과를 생성합니다.

>>> list(map(''.join, itertools.chain.from_iterable(itertools.product("ab", 
...     repeat=r) for r in range(4)))) # @nosklo's 
['', 'a', 'b', 'aa', 'ab', 'ba', 'bb', 'aaa', 'aab', 'aba', 'abb', 'baa', 
 'bab', 'bba', 'bbb']
>>> ab = ['']+list("ab")
>>> list(map(''.join, (a+b+c for a in ab for b in ab for c in ab)))  
['', 'a', 'b', 'a', 'aa', 'ab', 'b', 'ba', 'bb', 'a', 'aa', 'ab', 'aa', 
 'aaa', 'aab', 'ab', 'aba', 'abb', 'b', 'ba', 'bb', 'ba', 'baa', 'bab', 
 'bb',  'bba', 'bbb']

다음은 @nosklo와 동일한 출력을 생성하는 @Triptych의 솔루션입니다.

>>> ab = "ab"
>>> list(map(''.join, itertools.chain([''], ab, (a+b for a in ab for b in ab),
...     (a+b+c for a in ab for b in ab for c in ab))))
['', 'a', 'b', 'aa', 'ab', 'ba', 'bb', 'aaa', 'aab', 'aba', 'abb', 'baa', 
 'bab', 'bba', 'bbb']

세트의 모든 순열을 생성하기위한 많은 알고리즘이 있습니다. 여기서 원하는 것은 관련 문제이지만 직접적으로 분석하지는 않습니다. 제안 된 독서

질문에 정확하게 대답하지는 않지만 이것은 반환됩니다. n알파벳의 주어진 최대 길이와 문자에 대한 Th 조합을 사용할 알파벳.

#!/usr/bin/python

def nth_combination(n, maxlen=4, alphabet='abc'):
    """
    >>> print ','.join(nth_combination(n, 1, 'abc') for n in range(3))
    a,b,c
    >>> print ','.join(nth_combination(n, 2, 'abc') for n in range(12))
    a,aa,ab,ac,b,ba,bb,bc,c,ca,cb,cc
    >>> import string ; alphabet = string.ascii_letters + string.digits
    >>> print ','.join(nth_combination(n, 4, alphabet) for n in range(16))
    a,aa,aaa,aaaa,aaab,aaac,aaad,aaae,aaaf,aaag,aaah,aaai,aaaj,aaak,aaal,aaam
    >>> print ','.join(nth_combination(n, 4, alphabet)
    ...                for n in range(0, 14000000, 10**6))
    a,emiL,iyro,mKz2,qWIF,u8Ri,zk0U,Dxav,HJi9,LVrM,P7Ap,UjJ1,YvSE,2H1h
    """
    if maxlen == 1:
        return alphabet[n]
    offset, next_n = divmod(n, 1 + len(alphabet)**(maxlen-1))
    if next_n == 0:
        return alphabet[offset]
    return alphabet[offset] + nth_combination(next_n-1, maxlen-1, alphabet)

if __name__ == '__main__':
    from doctest import testmod
    testmod()

물론 이것은 항상 복합적으로 반복하는 대신 조합 세트에 임의의 액세스가 필요한 경우에만 의미가 있습니다.

만약에 maxlen 크기가 높기, 일부 속도 최적화는 줄을 연결하고 길이를 다시 계산함으로써 예를 들어 달성 될 수 있습니다. alphabet 그리고 maxlen-1 재귀의 각 수준에서. 비수체 적 접근도 의미가있을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top