제목만큼이나. 편지를 만드는 방법을 찾을 수없는 것 같습니다. Battleship 게임에 대한 코드를 작성 중이므로 그리드를 정의하는 데 사용해야합니다.격자 좌표와 함께 사용할 알파벳 목록을 만드는 방법은 무엇입니까? (즉, a, b, ..., z, aa, bb, ..., zz, aaa 등)
답변
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)))
사용 chr()
및 ord()
:
abc = [chr(i) for i in range(ord('a'),ord('z')+1)]
황색의를 대답; 단 하나의 거대한리스트가 하나, 둘, 셋의 문자 조합으로 순서대로 생성됩니다 (그리고 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
처럼 사용할 수 있습니다 어떤 여기에 기본 변환을 사용하여 완전히 일반적인 솔루션입니다. Steven Rumbalski의 의견에서 영감을 얻었습니다. 숫자에서 문자로 변환 할 때 사용하십시오. a
을 0
으로 처리하므로 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
당신은 하나의 문자가 부족하면 (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
개의 요소 만 가져 오는 데 사용됩니다.
- 1. 일반 가져 오기 테이블 AA - ZZ 만들기
- 2. 파일 만들기 aa..zz 및 범위 연산자를 사용하여 파일에 AA..ZZ를 작성
- 3. Aaa 사이의 차이; and a aaa();
- 4. A == B 대 B == A, 차이점은 무엇입니까
- 5. Java 배열 선언 {A [] AA = 새로운 B [10]}
- 6. LongListSelector를 사용하여 알파벳 순으로 목록을 그룹화하는 간단한 방법은 무엇입니까?
- 7. MVC 필터링 A-Z
- 8. Xsl & Silverlight : XSLT와 알고리즘을 사용하여 전체 라틴 알파벳 (a, b, c..z)을 어떻게 인쇄합니까?
- 9. (a | b)가 a - (a & b) + b와 같은 이유는 무엇입니까?
- 10. Z- 인덱스, 즉 자리
- 11. A-Z a-z 0-9 _ 및
- 12. [A] (B)와 일치 함 [A] (B)
- 13. 정규 표현식 [A-z]와 [a-zA-Z]의 차이
- 14. 파이썬 객체 혼동 : a = b, b 및 a 변경 수정!
- 15. 그룹 바닥 글에서 알파벳 문자 (A, B, C ...)를
- 16. 재귀 적으로 알파벳을 반복하는 방법은 무엇입니까?
- 17. 비 A-Z 항목을 쿼리하는 방법은 무엇입니까?
- 18. A/B 키 문제를 해결하는 방법은 무엇입니까?
- 19. 'if (A && B)'문을 평가하는 방법은 무엇입니까?
- 20. xsl 알파벳 목록을 반복합니다.
- 21. 편지 목록 ("a", "b", "c", ..., "z", "aa", "ab")은 어떻게 주문할 수 있습니까? 문자열 # succ 및 <=>은이 경우에 함께 잘 작동하지 않는 것 같습니다
- 22. a = b = 5 - 불가능합니까?
- 23. 큰 튜플 목록에서 튜플 목록을 작게 만드는 방법은 무엇입니까?
- 24. Regex a : b c d a : b
- 25. [A, B]] 중 하나에 [A, Iterable [B]]
- 26. PHP : 배열 병합 문제 A - Z! = a - z
- 27. getElementsByName는, 즉 등
- 28. Java에서 두 개의 배열을 병합하는 방법은 무엇입니까?
- 29. A - Z Wordpress 카테고리의 색인
- 30. Matlab은 문자열 "aaa"를 [ "a", "a", "a"] 배열로 변환합니다.
나는 Battleship이 맨 위의 A-L과 왼쪽의 1-10의 그리드를 사용한다고 생각했다. (http : //en.wikipedia.org/wiki/Battleship_ % 28game % 29) –
내부적으로 숫자로 그리드를 정의하고 입출력을 위해서만 다른 표기법으로 변환하는 것이 좋습니다. 게임 로직을 더 쉽게 작성할 수 있습니다. –
네,하지만 사용자의 요구를 충족시켜야하므로 이론적으로 유효한 그리드 크기를 지정할 수 있으며 레이블이 올바른지 확인해야합니다. – JDx