如何打印等间距的数据?



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

最新更新