如何制作一个连续的字母列表python(从a-z然后从aa,ab,ac等)

Posted

技术标签:

【中文标题】如何制作一个连续的字母列表python(从a-z然后从aa,ab,ac等)【英文标题】:How to make a continuous alphabetic list python (from a-z then from aa, ab, ac etc) 【发布时间】:2015-06-03 18:43:37 【问题描述】:

我想为类似于 Excel 工作表的应用程序制作一个按字母顺序排列的列表。

用户会输入单元格的数量,我想生成列表。 例如,用户需要 54 个单元格。然后我会生成

'a','b','c',...,'z','aa','ab','ac',...,'az','ba','bb'

我可以从[ref]生成列表

 from string import ascii_lowercase
 L = list(ascii_lowercase) 

我如何将它缝合在一起? 一个类似的 php 问题已经被问到here。有人有python等价物吗?

【问题讨论】:

【参考方案1】:

使用itertools.product

from string import ascii_lowercase
import itertools

def iter_all_strings():
    for size in itertools.count(1):
        for s in itertools.product(ascii_lowercase, repeat=size):
            yield "".join(s)

for s in iter_all_strings():
    print(s)
    if s == 'bb':
        break

结果:

a
b
c
d
e
...
y
z
aa
ab
ac
...
ay
az
ba
bb

这具有超越两个字母组合的额外好处。如果您需要一百万个字符串,它会很乐意为您提供三个、四个和五个字母的字符串。


额外的风格提示:如果您不喜欢在底部循环中使用显式 break,您可以使用 islice 使循环自行终止:

for s in itertools.islice(iter_all_strings(), 54):
    print s

【讨论】:

无论如何我可以说从 hhhh 开始 这太棒了。干得好,先生。【参考方案2】:

您可以使用列表推导。

from string import ascii_lowercase
L = list(ascii_lowercase) + [letter1+letter2 for letter1 in ascii_lowercase for letter2 in ascii_lowercase]

【讨论】:

这似乎没有得到单字母组合“a”、“b”等 好的,但是如果用户需要超过 702 个不同的字符串怎么办?他们需要超越“zz”进入“aaa”。 很公平......我从你的问题中不明白【参考方案3】:

按照@Kevin 的回答:

from string import ascii_lowercase
import itertools

# define the generator itself
def iter_all_strings():
    size = 1
    while True:
        for s in itertools.product(ascii_lowercase, repeat=size):
            yield "".join(s)
        size +=1

下面的代码可以生成字符串,例如可以用来生成唯一标签。

# define the generator handler
gen = iter_all_strings()
def label_gen():
    for s in gen:
        return s

# call it whenever needed
print label_gen()
print label_gen()
print label_gen()

【讨论】:

【参考方案4】:

我最终自己做了。 我认为它可以创建任意数量的字母。

def AA(n, s):
    r = n % 26
    r = r if r > 0 else 26
    n = (n - r) / 26
    s = chr(64 + r) + s

    if n > 26: 
        s = AA(n, s)
    elif n > 0:
        s = chr(64 + n) + s

    return s

n = quantity | r = remaining (26 letters A-Z) | s = string

打印列表:

def uprint(nc):
    for x in range(1, nc + 1):
        print AA(x,'').lower()

在转换为 python 之前使用 VBA:

Function AA(n, s)

    r = n Mod 26
    r = IIf(r > 0, r, 26)
    n = (n - r) / 26
    s = Chr(64 + r) & s

    If n > 26 Then
        s = AA(n, s)
    ElseIf n > 0 Then
        s = Chr(64 + n) & s
    End If

    AA = s

End Function

【讨论】:

这很好用。需要注意的是,AA 函数n = (n - r) / 26 中的行在Python 3.x 中应该使用地板除法(如n = (n - r) // 26【参考方案5】:

在 while 循环中使用 neo 的洞察力。 对于以升序排列的字符的给定迭代。 'A B C D...'。 n 是表示的第 N 个位置,从 1 开始作为第一个位置。

def char_label(n, chars):
    indexes = []
    while n:
        residual = n % len(chars)
        if residual == 0:
            residual = len(chars)
        indexes.append(residual)
        n = (n - residual)
        n = n // len(chars)
    indexes.reverse()
    label = ''
    for i in indexes:
        label += chars[i-1]
    return label

稍后您可以使用 for 循环打印所需的“标签”范围 n 的列表:

my_chrs = 'abc'
n = 15
for i in range(1, n+1):
    print(char_label(i, my_chrs))

或建立一个列表理解等......

【讨论】:

【参考方案6】:

打印小写和大写承租人的xl单元格范围集

大写:

from string import ascii_uppercase
import itertools
def iter_range_strings(start_colu):
    for size in itertools.count(1):
        for string  in itertools.product(ascii_uppercase, repeat=size):
            yield "".join(string)

input_colume_range = ['A', 'B']
input_row_range= [1,2]
for row in iter_range_strings(input_colume_range[0]):
    for colum in range(int(input_row_range[0]), int(input_row_range[1]+1)):
        print(str(row)+ str(colum))
    if row ==  input_colume_range[1]:
        break

结果:

A1
A2
B1
B2

【讨论】:

【参考方案7】:

两行(加上一个导入):

from string import ascii_uppercase as ABC

count = 100
ABC+=' '
[(ABC[x[0]] + ABC[x[1]]).strip() for i in range(count) if (x:= divmod(i-26, 26))]

如果需要重用,请将其包装在函数/lambda 中。

【讨论】:

【参考方案8】:

代码:

alphabet = ["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"]
for i in range(len(alphabet)):
    for a in range(len(alphabet)):
        print(alphabet[i] + alphabet[a])

结果:

aa
ab
ac
ad
ae
af
ag
ah
ai
aj
ak
al
am
...

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于如何制作一个连续的字母列表python(从a-z然后从aa,ab,ac等)的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Python 中的字符串列表制作直方图?

如何生成包含连续数字和字母的混合列表?

Python,Keras深度学习中非连续的字母怎么处理为one-hot编码

Python中如何使生成器函数来用元组返回一个字符串大写字母个数和小写字母个数?

如何在python中增加字母数字?

如何制作一个按字母滚动的列表?