簡體   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