python - 在此示例中,编写自定义循环以避免 str.format() 键错误的最佳方法是什么?
问题描述
我想输出如下所示的内容(每行 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
关键错误的最佳方法是什么?
解决方案
\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}}}"
对于这种特殊情况,我发现旧式格式更“干净”,因为它不需要双花括号。
要在每行中打印 20 个字符串,您可以将生成器传递给str.join()
.
完整代码:
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)
)
)
推荐阅读
- java - 单击提交按钮时无操作,但应注册用户
- google-admin-sdk - 未找到域
- java - 为什么 Arrays.asList(null) 会抛出 NullPointerException 而 Arrays.asList(someNullVariable) 不会?
- wpf - 如何将对话窗口定位在当前屏幕的左上角?
- laravel - 如何在不同的选项卡中加载不同的数据表?
- r - 如何按纬度过滤 sf 对象?
- javascript - SugarCRM 旧版 (v6) 中的自定义验证
- python - python中的简单迭代
- authentication - 资源“此处的 GUID 值”不存在或其查询的引用属性对象之一不存在
- r - 如何根据小部件输入向表中添加行?