2012-02-10 1 views
2

제목만큼이나. 편지를 만드는 방법을 찾을 수없는 것 같습니다. Battleship 게임에 대한 코드를 작성 중이므로 그리드를 정의하는 데 사용해야합니다.격자 좌표와 함께 사용할 알파벳 목록을 만드는 방법은 무엇입니까? (즉, a, b, ..., z, aa, bb, ..., zz, aaa 등)

+0

나는 Battleship이 맨 위의 A-L과 왼쪽의 1-10의 그리드를 사용한다고 생각했다. (http : //en.wikipedia.org/wiki/Battleship_ % 28game % 29) –

+1

내부적으로 숫자로 그리드를 정의하고 입출력을 위해서만 다른 표기법으로 변환하는 것이 좋습니다. 게임 로직을 더 쉽게 작성할 수 있습니다. –

+0

네,하지만 사용자의 요구를 충족시켜야하므로 이론적으로 유효한 그리드 크기를 지정할 수 있으며 레이블이 올바른지 확인해야합니다. – JDx

답변

2
import string 
import itertools 
one_letter_items = list(string.lowercase) 
two_letter_items = [''.join(x) for x in 
    itertools.product(string.lowercase, repeat=2)] 

items = one_letter_items + two_letter_items 

또는 더 컴팩트 한 형태 :

items = list(string.lowercase) + [''.join(x) for x in itertools.product(string.lowercase, repeat=2)] 

당신은 이상 (702)를 필요로하는 이유하지만 (repeat 값이 증가함에 따라 itertools.product()에 다른 전화를 사용하여, 같은 방법으로 긴 문자열을 계속 추가 할 수 있습니다 전함 게임 열, 나도 몰라). 당신은 문자의 모든를 사용하지 않을 경우

, 당신은 발전기 사용하여 일을 더 효율적으로 만들 수 있습니다

items = itertools.chain(string.lowercase, (''.join(x) for x in itertools.product(string.lowercase, repeat=2))) 
+0

깨끗하고 pythonic. 'string.lowercase'는 이런 일에 아주 편리합니다. ^^) – istruble

+1

우리가 정말로 더 멋지게 만들고 싶다면 목록을 함께 추가하는 대신 itertools.chain()을 사용할 수 있지만 meh. :) – Amber

0

사용 chr()ord() :

는 유사
abc = [chr(i) for i in range(ord('a'),ord('z')+1)] 
+0

어, 왜? 'list (string.lowercase)'는 그 작업에서 훨씬 더 간단합니다. – Amber

+0

'list (string.lowercase)'는'abc'에있는'[ 'a', 'b', ..., 'z']'값을주는 또 다른 방법입니다. – istruble

+0

이것은 어쨌든 질문에 대답하지 않습니다. 적어도 제목이 암시 하듯이. 그것은 이중, 삼중 등 "자리"로 계속 요청하는 것 같습니다. – Zenexer

0

황색의를 대답; 단 하나의 거대한리스트가 하나, 둘, 셋의 문자 조합으로 순서대로 생성됩니다 (그리고 range(1,4)에서 4를 늘림으로써 더 긴 조합으로 쉽게 확장 가능). 당신이 목록이 아닌 발전기를 만드는 선호하는 경우

import string 
import itertools 
ordered_abc_list = reduce(lambda x,y:x+y, 
          map(lambda N:[''.join(x) for x in itertools.product(string.lowercase, repeat=N)], 
           range(1,4) 
          ) 
         ) 

또는 :

ordered_generator = (''.join(s) for s in 
         itertools.chain(*map(lambda N:itertools.product(string.lowercase, repeat=N), 
              range(1,4) 
              ) 
             ) 
        ) 

for x in ordered_generator: 
    print x 
1

처럼 사용할 수 있습니다 어떤 여기에 기본 변환을 사용하여 완전히 일반적인 솔루션입니다. Steven Rumbalski의 의견에서 영감을 얻었습니다. 숫자에서 문자로 변환 할 때 사용하십시오. a0으로 처리하므로 aa, ab..을 생성하지 않습니다. 당신이 그런 의미에서 요구 한 것은 아니지만, 나는이 행동을 선호합니다. 보다 일관된 관용구를 사용합니다. 뒤로 이동

>>> from string import lowercase 
>>> def base_26_gen(x): 
...  if x == 0: yield x 
...  while x > 0: 
...   yield x % 26 
...   x //= 26 
... 
>>> def base_26_chr(x): 
...  return ''.join(lowercase[i] for i in reversed(list(base_26_gen(x)))) 
... 
>>> [base_26_chr(x) for x in range(100)] 
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'ba', 'bb', 'bc', 'bd', 'be', 
'bf', 'bg', 'bh', 'bi', 'bj', 'bk', 'bl', 'bm', 'bn', 'bo', 'bp', 'bq', 'br', 
'bs', 'bt', 'bu', 'bv', 'bw', 'bx', 'by', 'bz', 'ca', 'cb', 'cc', 'cd', 'ce', 
'cf', 'cg', 'ch', 'ci', 'cj', 'ck', 'cl', 'cm', 'cn', 'co', 'cp', 'cq', 'cr', 
'cs', 'ct', 'cu', 'cv', 'cw', 'cx', 'cy', 'cz', 'da', 'db', 'dc', 'dd', 'de', 
'df', 'dg', 'dh', 'di', 'dj', 'dk', 'dl', 'dm', 'dn', 'do', 'dp', 'dq', 'dr', 
'ds', 'dt', 'du', 'dv'] 

입니다 쉽게 :

>>> def b26_chr_to_b10(x): 
...  return sum((ord(c) - 97) * 26 ** i for i, c in enumerate(reversed(x))) 
... 
>>> b26_chr_to_b10('ab') 
1 
>>> b26_chr_to_b10('ba') 
26 
0

당신은 하나의 문자가 부족하면 (aa, ab, ac, ..., zy, zz)를 두 글자의 모든 조합을 싶어 할 때, 당신의 질문에서 약간 불분명하거나 할 같은 편지를 두 번 반복하면됩니다 (aa, bb, cc, ..., yy, zz)?

다른 답변

, 당신에게 (조합의 모든) 전자를 줄 것이다 단지의 경우 실제로 후자를 찾고 있습니다, 여기에 솔루션입니다 :

from itertools import islice, count 
import string 

width = 60 
columns = list(islice((c*n for n in count(1) for c in string.lowercase), width)) 

>>> print columns 
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh', 'ii', 'jj', 'kk', 'll', 'mm', 'nn', 'oo', 'pp', 'qq', 'rr', 'ss', 'tt', 'uu', 'vv', 'ww', 'xx', 'yy', 'zz', 'aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg', 'hhh'] 

이 임의의 번호를 작동 할 수 width을 사용하면 60이 그 예입니다. 생성자 (c*n for n in count(1) for c in string.lowercase)은 길이가 증가하는 고유 한 문자열을 무한히 생성하며 itertools.islice()width 개의 요소 만 가져 오는 데 사용됩니다.

관련 문제