Python 在另一个for循环中使用for循环

Python 在另一个for循环中使用for循环,python,python-3.x,Python,Python 3.x,我想用彩虹色打印一个文件。但是我有一个问题,下面是我的代码: 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

我想用彩虹色打印一个文件。但是我有一个问题,下面是我的代码:

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
,等等),但我得到的输出是这样的:
hhhhheeel…
(第一个
H
红色,第二个
H
黄色,等等)


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

你不想循环每个字母的颜色,只需循环颜色,你可以使用
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)

正如您所提到的,您不应该使用第二个for循环


您可以使用
color\u index
(初始值:0),并在每个循环中增加它(对颜色数进行模化),然后使用它:
color[color\u index]

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

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'对象在python 3中没有属性“izip”
,你不需要
itertools。izip
只要
zip
就可以了。它正在工作!你的答案和@achampion的答案有什么不同?不多,都使用
cycle
创建无限循环颜色列表,但这使用
zip()
将字母和颜色连接起来,而不是直接在循环生成器上调用
next()
zip()
下一步()是否需要调用,但开销稍大一些,因为它会创建一个元组,您可以在for循环中解包。请明确,开销很小,使用这两种解决方案都不会有问题,
zip()
在尝试同时处理两个列表时是惯用的。它会变成[1,2,3]进入无限列表[1,2,3,1,2,3,1,2,3,…]但没有创建列表的开销(参见生成器),我理解,它将创建一个生成器,这将[1,2,3]变成
[1,2,3,1,1,2,3,1,2,3,…
。然后我们使用
next()
调用它。正确的?