繁体   English   中英

打印字符串时数字字典键作为占位符?

[英]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)12是位置参数, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM