我创建了一个函数,该函数生成连续递增的字母列表。A,B,C ...,Z。在Z之后,到达AA,AB,AC ... AZ。此模式重复。这类似于MS Excel的列名。目前,此函数会生成一个有限的字母列表。
_column_name_generator() = ['A', 'B', ..., 'AA', 'AB', ..., 'BA', 'BB', ..., 'CV']
然后,我可以结合一些有限列表(例如0-10)对其进行迭代。请参阅下面的代码。我想要的是创建一个生成器,该生成器将为我提供无限长的递增字母列表。
import string
def _column_name_generator():
column_names = []
for x in range(0, 100):
if x < 26:
column_names.append(string.ascii_uppercase[x % 26])
else:
column_names.append(column_names[x/26 - 1] + string.ascii_uppercase[x % 26])
return column_names
container = []
for column_name, num in zip(_column_name_generator(), range(0, 10)):
container.append(column_name + str(num))
print _column_name_generator()
print container
container = ['A0', 'B1', 'C2', 'D3', 'E4', 'F5', 'G6', 'H7', 'I8', 'J9']
column_names
每次都产生Yield的最后一个元素,并使用itertools.count
而不是range
提供无限的增量:
import itertools
def _column_name_generator():
column_names = []
for x in itertools.count():
if x < 26:
column_names.append(string.ascii_uppercase[x % 26])
else:
column_names.append(column_names[x/26 - 1] + string.ascii_uppercase[x % 26])
yield column_names[-1]
更好的解决方案是更改原始代码,但无需使用消耗大量内存的column_names
,这是
import itertools, string
def _column_name_generator():
for i in itertools.count(1):
for p in itertools.product(string.ascii_uppercase, repeat=i):
yield ''.join(p)
它基本上遍历长度的乘积i
大写ASCII字母(每个序列可能)当i被逐渐增大,起始1
(A
,B
,C
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句