在本例中,编写自定义循环代码以避免str.format()键错误的最佳方法是什么?

2024-09-28 05:24:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我想输出如下内容(每行20个项目,需要两个变量,一个用于索引I,一个用于书名bookname,在本例中为“Psalm”):

\hyperlink{Psalm1}{1} & \hyperlink{Psalm2}{2} & \hyperlink{Psalm3}{3}  ...

使用Python(简化我的循环,但足以显示关键错误),我尝试:

        for indx in range(1, 150, 20):
            line = r""" \\hline
\\hyperlink{{{bn}{i}}}{{{i}}}  & \\hyperlink{{{bn}{i+1}}}{{{i+1}}} & \\hyperlink{{{bn}{i+2}}}{{{i+2}}} ... 
""".format( i=indx, bn = bookname)

重新编码以避免i+1键错误的最佳方法是什么


Tags: 项目内容for错误关键bn本例书名
2条回答

尝试使用f字符串

for i in range(1, 150, 20):
  print(f"\\hyperlinkPPsalm{i} & \\hyperlinkPsalm{i+1} & \\hyperlinkPsalm{i+2}")

下面是使用不同方法生成字符串(\hyperlink{Psalm1}{1})的示例:

i = 1
# string concatenation
formatted = r"\hyperlink{Psalm" + str(i) + "}{" + str(i) + "}"
# old-style formatting
formatted = r"\hyperlink{Psalm%d}{%d}" % (i, i))
# str.format
formatted = r"\hyperlink{{Psalm{0}}}{{{0}}}".format(i)
# f-string
formatted = rf"\hyperlink{{Psalm{i}}}{{{i}}}"

对于这个特殊的例子,我发现old-style formatting更“干净”,因为它不需要两倍的花括号

要在每行中打印20个字符串,可以将generator传递到^{}中,这将生成格式化字符串

完整代码:

stop = 150
step = 20
for i in range(1, stop + 1, step):
    print(
        " & ".join(
            r"\hyperlink{Psalm%d}{%d}" % (n, n)
            for n in range(i, min(i + step, stop + 1))
        )
    )

或者您也可以使用“一行”:

stop = 150
step = 20
print(
    "\n".join(  # use " &\n".join(...) if you need trailing '&'
        " & ".join(
            r"\hyperlink{Psalm%d}{%d}" % (n, n)
            for n in range(i, min(i + step, stop + 1))
        )
        for i in range(1, stop + 1, step)
    )
)

相关问题 更多 >

    热门问题