如何创建用于网格坐标的字母列表? (即a,b,...,z,aa,bb,...,zz,aaa等)

时间:2012-02-10 18:57:17

标签: python

就像标题所说的那样。我似乎找不到生成字母的方法。我需要它,因为我正在为游戏Battleship编写一些代码,所以我将用它来定义一个网格。

5 个答案:

答案 0 :(得分: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)]

您可以继续以相同的方式添加更长的字符串,方法是使用itertools.product()的另一个调用增加repeat值(但为什么在战舰游戏中需要超过702列,我不要不知道。

如果你不打算使用所有字母,你可以使用生成器提高效率:

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

答案 1 :(得分:1)

这是一个使用基本转换的完全通用的解决方案。它的灵感来自Steven Rumbalski的评论;用它来转换数字到字母。它不会生成aa, ab..等等,因为它会将a视为0。从那个意义上来说,这并不是你所要求的,但我更喜欢这种行为;它使用更一致的习语。

>>> 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

答案 2 :(得分:0)

使用chr()ord()

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

答案 3 :(得分: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

答案 4 :(得分:0)

你的问题有点不清楚,当你用完单个字母时,你想要得到两个字母的所有组合(aa, ab, ac, ..., zy, zz),或者你想只重复两次相同的字母({{ 1}})?

其他答案将为您提供前者(所有组合),以防您实际上正在寻找后者,这是一个解决方案:

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'] 使用的任意数字,60只是一个例子。生成器width将无限生成长度增加的唯一字符串,而itertools.islice()仅用于获取(c*n for n in count(1) for c in string.lowercase)个元素。