创建按字母顺序升序的列表

时间:2018-11-22 07:59:12

标签: python alphabetical

我想创建按字母顺序升序的名称,例如excel中的列名称。那就是我想要的东西。像a,b,c,...,z,aa,ab,... az,... zz,aaa,aab,....

我尝试过:

n,m = input().split()
A = [input().strip() for _ in range(int(n))]
B = [input().strip() for _ in range(int(m))]

C = [ [(idx + 1) for idx, s_B in enumerate(A) if s_B == s] if s in A else [-1] for s in B ]

for lst in C:
    print(*lst)

哪个会一直工作到 zz ,但会失败,因为它用完了索引

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

IndexError

5 个答案:

答案 0 :(得分:4)

您可以使用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),它等效于重复for次的嵌套i循环。

这将生成所需大小为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'
...

答案 1 :(得分:4)

对于一般解决方案,我们可以使用生成器和itertools中的islice

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来获取所需的任意多个字符串。

答案 2 :(得分:1)

尝试:

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

答案 3 :(得分:0)

您可以使用:

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]

答案 4 :(得分:0)

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)