【问题标题】:Create alphabetically ascending list创建按字母升序的列表
【发布时间】:2018-11-22 07:59:11
【问题描述】:

我想创建按字母升序排列的名称,例如 excel 中的列名。那就是我想拥有smth。比如 a,b,c,...,z,aa,ab,...az,...zz,aaa,aab,....

我试过了:

for i in range(1000):
    mod = int(i%26)
    div = int(i/26)
    print(string.ascii_lowercase[div]+string.ascii_lowercase[mod])

zz 之前有效,但由于索引用完而失败

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

索引错误

【问题讨论】:

  • 你要增加多少个字符?它是否以'zzz' 停止?还是您在iterator 之后?

标签: python alphabetical


【解决方案1】:

你可以使用itertools.product():

from itertools import product
from string import ascii_lowercase

for i in range(1, 4):
    for x in product(ascii_lowercase, repeat=i):
        print(''.join(x))

首先,您需要所有字母,然后是所有对,然后是所有三元组,等等。这就是为什么我们首先需要遍历所有您想要的字符串长度 (for i in range(...))。

然后,我们需要与i 字母的所有可能关联,因此我们可以使用product(ascii_lowercase),它相当于重复i 次的嵌套for 循环。

这将生成所需大小为i 的元组,最后只需join() 即可获取字符串。

要无限制地连续生成名称,请将for 循环替换为while

def generate():
    i = 0
    while True:
        i += 1
        for x in product(ascii_lowercase, repeat=i):
            yield ''.join(x)

generator = generate()
next(generator)  # 'a'
next(generator)  # 'b'
...

【讨论】:

  • 你的意思是for i in range(1, 4):?因为现在的方式将它们创建到'zz'
  • @Ev.Kounis 当然,我编辑了它,谢谢。最后,这个通用的解决方案让作者选择他需要的最大长度。
【解决方案2】:

对于通用解决方案,我们可以使用生成器和来自itertoolsislice

import string
from itertools import islice
def generate():
    base = ['']
    while True:
        next_base = []
        for b in base:
            for i in range(26):
                next_base.append(b + string.ascii_lowercase[i])
                yield next_base[-1]
        base = next_base

print('\n'.join(islice(generate(), 1000)))

还有输出:

a
b
c
...
z
aa
ab
...
zz
aaa
aab
...

您可以使用islice 来获取所需数量的字符串。

【讨论】:

  • 使用 4 个空格缩进。
【解决方案3】:

试试:

>>import string
>>string.ascii_lowercase
'abcdefghijklmnopqrstuvwxyz'
>>len(string.ascii_lowercase)
26

当您在下一行中的索引超过 26 时,它会引发异常

div = int(i/26)

,因为 ascii_lowercase 长度:

但你可以:

for i in range(26*26):  # <--- 26 is string.ascii_lowercase
    mod = int(i%26)
    div = int(i/26)
    print(string.ascii_lowercase[div]+string.ascii_lowercase[mod])

编辑:

或者你可以使用:

import string

n = 4  # number of chars
small_limit = len(string.ascii_lowercase)
limit = small_limit ** n
i = 0
while i < limit:
    s = ''
    for c in range(n):
        index = int(i/(small_limit**c))%small_limit
        s += string.ascii_lowercase[index]
    print(s)
    i += 1

【讨论】:

    【解决方案4】:

    你可以使用:

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

    【讨论】:

      【解决方案5】:

      Code Review SE上提供了这个问题的答案

      对链接中的答案稍作修改会给出以下内容,适用于任意数量的迭代。

      def increment_char(c):
          return chr(ord(c) + 1) if c != 'z' else 'a' 
      
      def increment_str(s):
          lpart = s.rstrip('z')
          num_replacements = len(s) - len(lpart)
          new_s = lpart[:-1] + increment_char(lpart[-1]) if lpart else 'a' 
          new_s += 'a' * num_replacements
          return new_s
      
      s = ''
      for _ in range(1000):
          s = increment_str(s)
          print(s)
      

      【讨论】:

        猜你喜欢
        • 2022-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-14
        • 2013-12-21
        • 2015-08-25
        • 2021-07-19
        相关资源
        最近更新 更多