当前位置: 首页 > 面试题库 >

如何创建无限迭代器以生成递增的字母图案?

仇航
2023-03-14
问题内容

我创建了一个函数,该函数生成连续递增的字母列表。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被逐渐增大,起始1ABC)。



 类似资料:
  • 看看我制作的以下类: 以及它在以下方面的用法: 如果我使用,可能令人惊讶的是,我将永远得不到无限流。 相反,代码将在底层方法中创建时永远循环。 到目前为止,这是纯理论上的,但如果我想首先跳过无限流中的前x个数字,然后用最后的y个数字来限制它,我可以明确地理解它的必要性,如下所示: 代码不会返回一个结果,应该怎么做呢?

  • 生成器迭代 手动迭代生成器,递归执行 AsyncTask::next,调用Generator::send方法将将yield值作为yield表达式结果。 yield表达式可能是一个异步调用,我们这里为之后把异步调用的结果作为yield表达式结果铺垫。 yield外侧括号在PHP5必须,PHP7不需要。 如, $ip = (yield async_dns_lookup(...) ); ^

  • 问题 你想实现一个自定义迭代模式,跟普通的内置函数比如 range() , reversed() 不一样。 解决方案 如果你想实现一种新的迭代模式,使用一个生成器函数来定义它。 下面是一个生产某个范围内浮点数的生成器: def frange(start, stop, increment): x = start while x < stop: yield x

  • 是否可以从迭代器创建一个流,其中对象的序列与通过反复调用迭代器的next()方法生成的序列相同?我所考虑的具体情况涉及到Treeset.desceningIterator()返回的迭代器的使用,但是我可以想象在其他情况下,迭代器是可用的,而不是它所引用的集合。 例如,对于,我们可以编写并按照该集合的排序顺序获取该集合中的对象流,但是如果我们希望它们按照不同的顺序,比如通过使用获得的顺序呢?我想象的

  • 问题内容: 改善这个问题 我是android编码练习的新手 假设这是我的第一个ID,我希望使用共享的首选项将此值自动递增1并用作员工ID。如ABB20180002,ABB20180003,ABB20180004等。 问题答案: 您不能直接增加字母数字值。如果要这样做,您需要为其编写一些代码行 这是 activity_main.xml 这是 MainActivity.java 希望这会帮助你。

  • 这篇内容挺多的,而且比内容不好理解。或许新手看完后,还会一脸懵逼,不过这是正常的,如果你看完后,是迷糊的,那么建议你继续学习后面的内容,等学完,再回来看几次。 注:这也是我第二次修改内容没有改过的章节。 目录