【问题标题】:Justify keys and values from a dict in PYTHON在 PYTHON 中为 dict 中的键和值对齐
【发布时间】:2021-02-05 13:13:24
【问题描述】:

我正在开发一个程序,该程序将证明来自名为 make_tabledict 中的一些键和值。

这就是我的代码主体的样子:

def make_table(**kwargs):
    for key, value in kwargs.items():
        pass

make_table(
    key_position="right",
    value_position="center",
    song="Style",
    artist_name="Taylor $wift",
    album="1989"
)

这就是我需要打印的结果:

===================================
|             song |    Style     |
|      artist_name | Taylor $wift |
|            album |    1989      |
===================================

我现在需要知道的是如何证明我的 kwargs.items() 的内容就像在结果中询问并打印它们但不打印行:key_position="right" 和 value_position="center" 因为它们功能只是为了证明。

谢谢。

【问题讨论】:

  • 对于 justify 部分,我知道我可以使用 .format() 来实现: print('| {} | {} |'.format(key, value))

标签: python keyword-argument justify


【解决方案1】:

此函数会按照您的要求打印表格,但它会更改函数签名以使事情更简单。此外,它通过查看它们各自的最长长度来适应您的键和值的长度。

def make_table(d, key_align, val_align):
    max_key_len = max(map(len, d.keys()))
    max_val_len = max(map(len, d.values()))
    
    n_equals = (2 + max_key_len + 3 + max_val_len + 2)
    s = n_equals * '=' + '\n'
    for key in d:
        s += "| "
        
        if key_align == 'left':
            s += "{key:<{length}}".format(key=key, length=max_key_len)
        elif key_align == 'right':
            s += "{key:>{length}}".format(key=key, length=max_key_len)
        elif key_align == 'center':
            s += "{key:^{length}}".format(key=key, length=max_key_len)
            
        s += " | "    
        
        if val_align == 'left':
            s += "{val:<{length}}".format(val=d[key], length=max_val_len)
        elif val_align == 'right':
            s += "{val:>{length}}".format(val=d[key], length=max_val_len)
        elif val_align == 'center':
            s += "{val:^{length}}".format(val=d[key], length=max_val_len)
            
        s += " |\n"
        
    s += n_equals * '='
            
            
    return s


song_dict = {
    "Song": "Style",
    "Artist Name": "Taylor $wift",
    "Album": "1989"
}

table = make_table(song_dict, key_align='right', val_align='center')
print(table)

Python 脚本的输出:

==============================
|        Song |    Style     |
| Artist Name | Taylor $wift |
|       Album |     1989     |
==============================

【讨论】:

  • 非常感谢我没有考虑使用 map() 函数,现在它更直观了。但是有没有办法保留我的表名 make_table 还是很烦人的方式?
  • 如果保留表名意味着保留 **kwargs,我看到有两种方法可以做到这一点,但它们都有点烦人。首先,遍历kwargs并创建一个没有“key_position”和“value_position”的字典,然后正常使用我的函数。其次,当键是“key_position”或“value_position”(忽略它们)时,添加一个 if 语句来做一些不同的事情。
【解决方案2】:

使用格式字符串的示例:

def make_table(**kwargs):
    s = "="*29
    for key, value in kwargs.items():
        s += f"\n|{key:>15} |{value:^10}{'|':<2}"
    
    s += "="*29
    return s

kv = {YOUR DICT}
print(make_table(**kv))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    相关资源
    最近更新 更多