创建按字母顺序升序的列表
Create alphabetically ascending list
我想创建按字母顺序升序排列的名称,例如 excel 中的列名称。那就是我想要……像 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
IndexError
你可以使用 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'
...
对于通用解决方案,我们可以使用生成器和 islice
来自 itertools:
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
来获取任意数量的字符串。
您可以使用:
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]
上提供了此问题的答案
对 link 中的答案稍作修改,给出以下适用于任意次数的迭代。
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)
尝试:
>>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
我想创建按字母顺序升序排列的名称,例如 excel 中的列名称。那就是我想要……像 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
IndexError
你可以使用 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'
...
对于通用解决方案,我们可以使用生成器和 islice
来自 itertools:
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
来获取任意数量的字符串。
您可以使用:
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]
对 link 中的答案稍作修改,给出以下适用于任意次数的迭代。
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)
尝试:
>>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