[英]Numerical dictionary keys as placeholders when printing strings?
我有以下代码:
board_dic = {
0: '_',
1: '_',
2: '_',
3: '_',
4: '_',
5: '_',
6: '_',
7: '_',
8: '_',
}
print("|{0}|{1}|{2}|\n|{3}|{4}|{5}|\n|{6}|{7}|{8}|".format(**board_dic)
运行时的输出是:
line 28, in <module>
print("|{0}|{1}|{2}|\n|{3}|{4}|{5}|\n|{6}|{7}|{8}|".format(**board_dic))
IndexError: Replacement index 0 out of range for positional args tuple
我在任何地方都找不到解决方案。 如果我要将board_dic
的键board_dic
为字符串,例如'a'
、 'b'
、 'c'
等,并将打印语句中的占位符替换为'a'
、 'b'
、 'c'
等. 然后我的打印语句将毫无问题地执行。 但是,问题似乎特别与数字键字典值有关。
为什么会这样,我该如何解决?
使用格式字符串时, {1}
等占位符表示“format()”的第 n 个参数。 这与命名关键字参数不同。 使用**board_dic
会将它们分解为关键字参数。 这就是它不能按预期工作的原因。
相反,您需要使用单个*
使用位置参数。 但是随后您会遇到一个不同的问题:据我所知,字典排序仅成为 Python 3.7 语言规范的一部分。 它在以前的版本中已经稳定,但这是一个实现细节,在其他版本(pypy、jython 等)中无法保证。
所以我们需要对它进行排序以 100% 确定这有效。
由于键是数字,我们可以简单地对board_dic.items()
排序。 这将为我们提供一个稳定的替代品。
然后我们需要提取有效值。 我们可以通过一个简单的列表理解来做到这一点。
在那次更改之后,只要字典不包含任何缺失的数字,我们就 100% 确定输出是正确的。
我们可以使用单个“位置参数扩展”在.format()
使用结果列表。
board_dic = {
0: '_',
1: '_',
2: '_',
3: '_',
4: '_',
5: '_',
6: '_',
7: '_',
8: '_',
}
values = [value for _, value in sorted(board_dic.items())]
print("|{0}|{1}|{2}|\n|{3}|{4}|{5}|\n|{6}|{7}|{8}|".format(*values))
如果您知道要查找的内容,请在此处进行说明:
field_name 本身以一个 arg_name 开头,它可以是数字或关键字。 如果它是一个数字,它指的是一个位置参数,如果它是一个关键字,它指的是一个命名的关键字参数。 如果格式字符串中的数字 arg_names 依次为 0, 1, 2, ... ,它们都可以省略(不仅仅是一些),并且数字 0, 1, 2, ... 将按该顺序自动插入。 因为 arg_name 不是引号分隔的,所以不可能在格式字符串中指定任意的字典键(例如,字符串 '10'或 ':-]')。
简单来说, '{0} {1}'.format(...)
的意思是“替换{0}
与第一位置参数和{1}
与第二位置参数format(...)
位置参数是那些在函数调用中未指定参数名称而传递的参数。 例如在format(1, 2, c=3)
, 1
和2
是位置参数, c=3
是关键字参数。
但是**board_dic
语法指定了关键字参数! format(**board_dic)
等价于format(0='_', 1='_', 2='_', ...)
1并且没有位置参数。 因此,使用{0}
、 {1}
、 {2}
等获取第一个、第二个、第三个等位置参数失败。
为了将带有整数键的字典传递给format
,您可以使用以下命令:
print("|{d[0]}|{d[1]}|{d[2]}|\n|...".format(d=board_dic))
1不允许使用数字作为关键字是另一个问题。
要使用它们的键将 dict 值转换为str.format
方法的位置参数,您可以将 dict 的长度range
映射到 dict 的get
方法并将输出序列解包为参数:
print("|{0}|{1}|{2}|\n|{3}|{4}|{5}|\n|{6}|{7}|{8}|".format(*map(board_dic.get, range(len(board_dic)))))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.