Data:
game_match = {'G02': ['MineCraft', 'S', '5', 5, 3, 2, 0, 0], 'G05': ['Hopscotch', 'N', '2', 5, 3, 2, 0, 0], 'G07': ['Dominoes', 'S', '5', 5, 2, 3, 0, 2], 'G08': ['Chess', 'N', '3', 5, 2, 3, 1, 2], 'G10': ['Monopoly', 'N', '3', 5, 1, 4, 2, 2]}
对于字典中的每个键和值,我要打印:
键, 值[0], 值[1], 值[2], 值[- 3], 值[4]
我的代码:
dash = '-' * 48
print(f'GameID{" ":7}Name{" ":7}Weight{" ":2}Nplayer{" ":2}Win{" ":2}', end='')
print('')
print(dash)
for k, v in game_match.items():
print(f'{k:10}{v[0]:^5}({v[1]}){" ":^5}{v[2]:6}{v[3]:3}{" ":6}{v[4]}')
输出:
GameID Name Weight Nplayer Win
------------------------------------------------
G02 MineCraft(S) 5 5 3
G05 Hopscotch(N) 2 5 3
G07 Dominoes(S) 5 5 2
G08 Chess(N) 3 5 2
G10 Monopoly(N) 3 5 1
我想以相等的间距打印上面的数据,但似乎失败了。什么代码或格式是正确的?
预期输出:
GameID Name Weight Nplayer Win
------------------------------------------------
G02 MineCraft(S) 5 5 3
G05 Hopscotch(N) 2 5 3
G07 Dominoes(S) 5 5 2
G08 Chess(N) 3 5 2
G10 Monopoly(N) 3 5 1
您的错误是字段大小不应小于字段的最大大小。当最大值为 9 时,将 5 用于第二个字段。如果我只是用以下方法更改该值:
...
print(f'{k:10}{v[0]:>9}({v[1]}){" ":^5}{v[2]:6}{v[3]:3}{" ":6}{v[4]}')
它给出:
GameID Name Weight Nplayer Win
------------------------------------------------
G02 MineCraft(S) 5 5 3
G05 Hopscotch(N) 2 5 3
G07 Dominoes(S) 5 5 2
G08 Chess(N) 3 5 2
G10 Monopoly(N) 3 5 1
我选择将其正确对齐,以便更轻松地将其与第三个字段连接起来。为了将其左对齐,应首先进行串联:
...
print(f'{k:10}{v[0] + "(" + v[1] + ")":12}{" ":^5}{v[2]:6}{v[3]:3}{" ":6}{v[4]}')
获得:
GameID Name Weight Nplayer Win
------------------------------------------------
G02 MineCraft(S) 5 5 3
G05 Hopscotch(N) 2 5 3
G07 Dominoes(S) 5 5 2
G08 Chess(N) 3 5 2
G10 Monopoly(N) 3 5 1
让我们把这个问题分解成更小的部分并思考一下。
您显然已经知道如何将两个字段与所需的文本组合在一起:
>>> a = "Minecraft" # v[0]
>>> b = "S" # v[1]
>>> f'{a}({b})' # v[0] and v[1] combined, with other text
'Minecraft(S)'
看起来您已经知道如何将字符串格式化为固定宽度的列;我将在下面使用 15 的宽度:
ab_combined = "Minecraft(S)"
>>> f"{ab_combined:15}" # v[0] and v[1] formatted into a column with other text
'Minecraft(S) '
您遇到的问题是如何将两个字段同时组合成一定宽度的单个列。
换句话说,您希望将字段 a 和字段 b(对应于v[0]
和v[1]
)合并为一个字符串,然后将字符串格式化为一列。因此,让我们通过几个步骤来构建它:
f'{v[0]}({v[1]})'
太好了,我们有合并的文本。但是,如何将组合的文本字符串放入一定宽度的列中呢?有几种方法。这是其中之一:
field_v0_and_v1 = f'{v[0]}({v[1]})'
f'{field_v0_and_v1:15}'
没关系!两行很好。但您也可以使用嵌套的 f 字符串以这种方式在一行中执行此操作。更难阅读。以你目前的技能水平,我真的不推荐它。但它也不算太糟糕:
f"{f'{v[0]}({v[1]})':15}"
您可以使用字符串连接将其与格式字符串的其余部分放在一起:
f'{k:10}' f"{f'{v[0]}({v[1]})':15}" f'{v[2]:>6}{v[3]:>6}{v[4]:>6}'
使用这样的串联将 f 字符串分解成多个部分确实可以帮助您思考自己在做什么,一次一块。我强烈推荐它。
请注意,我已将数字字段更改为与>
字符右对齐,这是您想要的。我还删除了无关的仅空格列(例如f'{" ":6}'
),这不是必需的。
<关于串联的进一步说明,因为它很有用>
请注意上面f 字符串文本之间的空格。这将使用串联组合字符串,并适用于任何字符串:
>>> 'a' 'b'
'ab'
但是你不能使用恰好包含字符串的变量来做到这一点;python解析器不知道你的变量中有什么:
>>> a, b = 'a', 'b'
>>> a b
# SyntaxError
。不使用字符串文字时,必须使用加法运算符或使用格式设置:
>>> a + b
'ab'
>>> f'{a}{b}'
'ab'
最后提示:如果要动态调整数字列宽,可以将值存储在变量中并在 f 字符串中计算它们:
col_w = 6
f'{k:10}' f"{f'{v[0]}({v[1]})':15}" f'{v[2]:>{col_w}}{v[3]:>{col_w}}{v[4]:>{col_w}}'
看看str
方法
ljust
center
rjust
它们至少需要一个宽度参数,它们通过添加空格(可以使用第二个可选参数进行更改)或返回原始参数(如果已经更长)来生成给定宽度的字符串。考虑以下示例
for x in ["A","BB","CCC","DDDD","EEEEE"]:
print(x.rjust(5))
输出
A
BB
CCC
DDDD
EEEEE
ljust
只向左,rjust
向右,center
居中
解析 print 语句之前的 "Name" 列,以便您可以正确设置该列的格式,如下所示:
...
for k, v in game_match.items():
name = f"{v[0]}({v[1]})"
print(f'{k:10}{name:<12}{" ":^5}{v[2]:6}{v[3]:3}{" ":6}{v[4]}')
尝试使用{" "*<int>}
而不是{" ":<int>}
。
dash = '-' * 48
print(f'GameID{" ":7}Name{" ":7}Weight{" ":2}Nplayer{" ":2}Win{" ":2}', end='')
print('')
print(dash)
for k, v in game_match.items():
print(f'{k:10}{v[0]:^5}({v[1]}){" "*(11-len(v[0])+3)}{v[2]:6}{v[3]:3}{" ":6}{v[4]}')
输出:
GameID Name Weight Nplayer Win
------------------------------------------------
G02 MineCraft(S) 5 5 3
G05 Hopscotch(N) 2 5 3
G07 Dominoes(S) 5 5 2
G08 Chess(N) 3 5 2
G10 Monopoly(N) 3 5 1
问题是您的"游戏名称"比您保留的 5 个空格长。更准确地说,它是 12 个字符的长度。
通过打印代码的一点更改,我想我冷解决了这个问题。检查它是否足够你。
dash = '-' * 48
print(f'GameID{" ":7}Name{" ":7}Weight{" ":2}Nplayer{" ":2}Win{" ":2}', end='')
print('')
print(dash)
for k, v in game_match.items():
game_name = f"{v[0]}({v[1]})"
print(f'{k:10}{game_name:12}{" ":^5}{v[2]:6}{v[3]:3}{" ":6}{v[4]}')
输出就是这样。
GameID Name Weight Nplayer Win
------------------------------------------------
G02 MineCraft(S) 5 5 3
G05 Hopscotch(N) 2 5 3
G07 Dominoes(S) 5 5 2
G08 Chess(N) 3 5 2
G10 Monopoly(N) 3 5 1