【问题标题】:Use for loop inside another for loop在另一个 for 循环中使用 for 循环
【发布时间】:2015-09-12 06:15:53
【问题描述】:

我正在尝试以彩虹色打印文件。但是我有一个问题,这是我的代码:

color = [91, 93, 92, 96, 94, 95]

with open(sys.argv[1]) as f:
for i in f.read():
    for c in color:
        print('\033[{0}m{1}\033[{0};m'
              .format(c, i), end='', flush=True)

问题是,我想要这样的输出:Hello(H 红色,e 黄色等),但我得到这样的输出:HHHHHeeeeellll...(first H红色,第二个 H 黄色等)。

我知道,因为第一个 for 将循环第二个 for。但是我该如何解决呢?

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    您不想循环遍历每个字母的颜色,只需循环颜色,您可以使用 itertools.cycle 循环颜色,只需调用 next() 即可获得下一个颜色:

    from itertools import cycle
    color = cycle([91, 93, 92, 96, 94, 95])
    
    with open(sys.argv[1]) as f:
        for i in f.read():
           print('\033[{0}m{1}\033[{0};m'
                 .format(next(color), i), end='', flush=True)
    

    【讨论】:

    • 它将 [1,2,3] 变成无限列表 [1,2,3,1,2,3,1,2,3,...] 但没有创建开销列表(见生成器)
    • 我明白了,它会创建一个生成器,然后将 [1,2,3] 变成[1,2,3,1,2,3,1,2,3,...] 。然后我们使用next() 来调用它。对吗?
    【解决方案2】:

    您必须以“压缩”方式迭代它们,可能重复第二个。

    color = [91, 93, 92, 96, 94, 95]
    
    with open(sys.argv[1]) as f:
        for i, c in itertools.izip(f.read(), itertools.cycle(color)):
            print('\033[{0}m{1}\033[{0};m'
              .format(c, i), end='', flush=True)
    

    【讨论】:

    • 嗯,我收到了这个错误:AttributeError: 'module' object has no attribute 'izip'
    • 在 python 3 中你不需要itertools.izip 只需zip 就可以了。
    • 它正在工作!你的答案和@achampion 的答案有什么区别?
    • 不多,两者都使用cycle创建无限循环颜色列表,但这使用zip()连接字母和颜色,而不是直接在循环生成器上调用next() . zip() 会为您调用 next(),但会产生更多开销,因为它会创建一个您在 for 循环中解包的元组。
    • 只是为了清楚开销很小,我使用这两种解决方案都没有问题,zip() 在尝试同时处理 2 个列表时是惯用的。
    【解决方案3】:

    正如你所说,你不应该使用第二个 for 循环。

    您可以使用color_index(初始值:0),并在每个循环中递增它(以颜色数为模),然后使用它:color[color_index]

    【讨论】:

      猜你喜欢
      • 2014-03-21
      • 2015-10-18
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 1970-01-01
      • 2011-10-18
      相关资源
      最近更新 更多