首页 > 解决方案 > 有没有办法在 print 语句中使用 for 循环?

问题描述

我是初学者,请多多包涵

我有以下代码:

shapes = ['rect', 'rect', 'circle']
coords = ["34,44,210", "290,333,250", "337,300,44"]

for shape in shapes:
    for coord in coords:
        print(shape)
        print(coords)

我很清楚这会多次打印出来,但我无法找到避免它的方法。
我认为更好的方法是在 print 语句中一个接一个地使用它,如下所示:

print(shape for shape in shapes)
print(coord for coord in coords)

但这不起作用,只能打印

<generator object <genexpr> at 0x00000282B2C69510>
<generator object <genexpr> at 0x00000282B2C69510>

我找不到在 print 语句中打印 for 循环的指南。
我正在使用它来打印类似的东西:

id='rect' id2='34,44,210'
id='rect' id2='290,333,250'
id='circle' id2='337,300,44'

有办法吗?提前致谢。

编辑:我希望能够打印那个确切的东西。

标签: python-3.xfor-loop

解决方案


使用生成器表达式已经朝着正确的方向发展。但是,必须在调用中将其unpack以将项目从生成器中取出到print

print(*(shape for shape in shapes))

在这种情况下,这有点没用,因为生成器没有做任何有用的事情——print(*shapes)在这里也能正常工作。

作为一个更有用的例子,如果你想打印所有形状和坐标的组合,可以使用两个序列的生成器:

shapes = ['rect', 'rect', 'circle']
coords = ["34,44,210", "290,333,250", "337,300,44"]
print(*((shape, coord) for shape in shapes for coord in coords))

Python 附带了各种实用程序,这些实用程序已经实现了常见的迭代模式。例如,可以通过创建两个列表的组合itertools.product(shapes, coords)

对于此类数据,您可能需要的是两个可迭代对象的成对折叠。这是一个常见的用例,因此 Python 有一个始终可用的助手:内置函数zip

>>> shapes = ['rect', 'rect', 'circle']
>>> coords = ["34,44,210", "290,333,250", "337,300,44"]
>>> # unpack pairs directly
>>> print(*zip(shapes, coords))
('rect', '34,44,210') ('rect', '290,333,250') ('circle', '337,300,44')
>>> #       v ----     format each pair     ---- v
>>> print(*(f"{shape}={coord}" for shape, coord in zip(shapes, coords)))
rect=34,44,210 rect=290,333,250 circle=337,300,44
>>> #       v ----     format each pair     ---- v                     v separate by newline
>>> print(*(f"{shape}={coord}" for shape, coord in zip(shapes, coords)), sep="\n")
rect=34,44,210
rect=290,333,250
circle=337,300,44

请记住,使用常规for循环并没有错。如果要在单个换行符分隔的打印解压缩格式的压缩对表达式和多个语句之间进行选择,请使用更具可读性的选项。

for shape, coord in zip(shapes, coords):
    print(shape, '=', coord, sep='')

推荐阅读