【问题标题】:TypeError: unsupported format string passed to list.__format__TypeError:不支持的格式字符串传递给 list.__format__
【发布时间】:2018-09-17 18:52:44
【问题描述】:

我有两个名为 results 和 p_results 的列表。我想在表中显示这些列表值,例如 if

results = [1,2,3,4]
p_results = [5,6,7,8]

我想要这样的东西

1     5
2     6
3     7
4     8

        print('{:3}{:20}'.format(results, p_results))

运行代码:

runfile('D:/4/2d.py', wdir='D:/4')
Traceback (most recent call last):

  File "<ipython-input-59-1abb0c96f0c0>", line 1, in <module>
    runfile('D:/4/2d.py', wdir='D:/4')

  File "C:\Users\Rabinsen\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 668, in runfile
    execfile(filename, namespace)

  File "C:\Users\Rabinsen\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 108, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "D:/4/2d.py", line 61, in <module>
    print('{:3}{:20}'.format(results, p_results))

TypeError: unsupported format string passed to list.__format__

【问题讨论】:

  • 将列表作为参数传递对格式选项的限制更大。你能创建一个minimal reproducible example,包含输入和你想要输出的内容吗?
  • bin_freqs(或者至少是它的缩进)几乎肯定是错误的;您的循环都不是一次以上的迭代,因为您在 if 语句的两个分支中都返回。
  • 在 StackOverflow 上提出一个好问题的关键,实际上也是良好调试的关键,是隔离问题。该错误为您提供了在调用 print 函数时出现问题的线索。
  • 我刚刚编辑了这个问题,你能再检查一遍吗@Jean-FrançoisFabre
  • 您的问题中的代码太多。只是格式问题。 2 到 3 行代码就足以重现它。

标签: python list string-formatting


【解决方案1】:

一个技巧是解决间距部分:

'{:15}'.format('{}'.format([1,2,3]))

对于两个列表的迭代:

[print('res:', i, ': p_res', j) for i, j in zip(results, p_results)]
res: 1 : p_res 5
res: 2 : p_res 6
res: 3 : p_res 7
res: 4 : p_res 8

结合格式化和压缩可以实现您想要实现的目标。

【讨论】:

    【解决方案2】:

    您可以将list 类型传递给format(仅使用{}),但您请求的格式不可用。而且标准格式也不适合,所以...

    你想要的是一个单独的列中的每个列表。您必须将zip 列表放在一起,并迭代结果以将其传递给格式:

    results = [1,2,3,4]
    p_results = [5,6,7,8]
    
    for result,p_result in zip(results,p_results):
        print('{:3}{:20}'.format(result,p_result))
    

    打印如下:

      1                   5
      2                   6
      3                   7
      4                   8
    

    【讨论】:

    • 次要旁注:zip,就像许多产生tuples 的内置函数一样,有一个优化,可以重用有问题的tuple,如果在下一个值是请求。对于一个正常的循环,只有当您将生成的 tuple 向上解压(或更奇怪的是,del 稍后编辑它)时才会出现这种情况。避免拆包不会为您节省太多(如果有的话),如果拆包可以让您使用更有意义的名称,那么它可能是更好的选择。对于性能,无论多么丑陋,for formatted in map('{:3}{:20}'.format, results, p_results): print(formatted) 都会得到它。 :-)
    • 正在考虑for args in zip(results,p_results): print('{:3}{:20}'.format(*args))
    【解决方案3】:

    如果你还想用一行来做,写:

    results = [1,2,3,4]
    p_results = [5,6,7,8]
    
    [print("{:3}{:20}".format(*x)) for x in np.c_[results,p_results]][0]
    

    打印出来的:

      1                   5
      2                   6
      3                   7
      4                   8
    

    可以肯定的是,np 是用于 NumPy

    【讨论】:

    • 为此使用 numpy 太过分了
    • 如前所述,这只是另一种方式。也许有人足够懒惰(比如我:))。
    【解决方案4】:

    基于@istvan 解决方案,只需使用str 包装您的列表:

    f'{str(my_list):15}{str(my_other_list):25}'
    

    (或者如果您坚持使用@istvan 示例:)

    '{:15}'.format(str([1,2,3]))
    # or
    f'{str([1,2,3]):15}'
    

    【讨论】:

      【解决方案5】:

      你试过print('{},{}'.format(results[:3], p_results[:20]))

      您构建print 的方式看起来像是两种样式的组合,

      print(f'{results[:3]}, {p_results[:20]}')

      print('{}, {}'.format(results[:3], p_results[:20]))

      你的尝试是

      print('{:3}, {:20}'.format(results, p_results))

      这是您的错误的根源,这里是重现相同错误的示例:

      >>> a = [1, 2, 3]
      >>> print('{:1}'.format(a))
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      TypeError: unsupported format string passed to list.__format__
      
      >>> print('{}'.format(a[:1]))
      [1]
      

      【讨论】:

      • 它不起作用我希望以表格形式输出...一个列表作为一列,另一个列表作为另一列
      • 让我们先解决这个问题
      • 它适用于另外两个列表,但不适用于此...我不知道为什么它不起作用
      【解决方案6】:

      我建议您为此目的使用 Pandas 库

      import pandas as pd
      results = [1,2,3,4]
      p_results = [5,6,7,8]
      d = {'column-1':results, 'column-2':p_results}
      data_frame = pd.DataFrame(data=d)
      print(data_frame)
         column-1  column-2
      0         1         5
      1         2         6
      2         3         7
      3         4         8
      

      请注意,您有一个使用数据框对象

      的索引

      您还可以将新列设为操作,例如 让我们创建第三列来存储 column-1 和 column-2 的乘积

      data_frame['product'] = data_frame['column-1']*data_frame['column-2']
      

      您现在打印的结果是:

         column-1  column-2  product
      0         1         5        5
      1         2         6       12
      2         3         7       21
      3         4         8       32
      

      希望这会有所帮助! 编码愉快!

      【讨论】:

        猜你喜欢
        • 2017-12-30
        • 2021-10-31
        • 2021-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多