[英]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.