【问题标题】:How do you print superscript in Python?如何在 Python 中打印上标?
【发布时间】:2021-04-12 08:27:29
【问题描述】:

我知道 python 中的 \xb 函数,但它似乎对我不起作用。我知道我可能需要下载第三方模块来完成此操作,如果需要,哪个最好?

我目前正在编写一个二项式展开求解器,以尝试使用我自学的技能。当我尝试显示用户输入的扩展以供确认时出现问题。目前我不得不像这样打印表达式:

var1 = input("Enter a: ")
var2 = input("Enter b: ")
exponent = input("Enter n: ")

a = int(var1)
b = int(var2)
n = int(exponent)

expression = ('(%(1)dx%(2)d)^%(3)d') %\
{'1' : a, '2' : b, '3' : n}

print(expression)

confirmation = input(str("Is this correctt? Y/N "))

这会打印 (2x4)^5,而我更喜欢将索引打印为上标。如何做到这一点?

【问题讨论】:

  • 您需要指定输出设备/格式,因为这决定了如何标记上标。例如,在 HTML 中,您将输出 (2x4)<sup>5</sup>.
  • 不要在 Python 2.x 上使用input(),而是使用int(raw_input())。否则,请指定您使用 Python 3.x。

标签: python math superscript


【解决方案1】:

您需要使用“格式”类型的东西。使用{}\u00b2".format(area))" and the{}becomes a²`。这是一个例子:

print("The area of your rectangle is {}cm\u00b2".format(area))

代码末尾将打印cm²。您可以将末尾的大 2 更改为其他数字以获得不同的结果。 不过我不知道如何做下标。

【讨论】:

  • > 您可以将末尾的大 2 更改为其他数字以获得不同的结果。 这不是真的。而\u00b3 返回³\u00b4 返回´\u00b5 返回µ
【解决方案2】:

在 Python 3.6+ 中(仅提及该示例是因为该示例使用了以前版本中不可用的 f 字符串)命名 Unicode 字符提供了一种易于编写、易于阅读的方式来执行此操作。 Here is a list.

例子:

f'\N{GREEK SMALL LETTER GAMMA}={density:.2f} t/m\N{SUPERSCRIPT THREE}'

产生类似

的东西
γ=1.20 t/m³

【讨论】:

  • 这实际上从Python 3.3开始工作。
  • 不,它没有:since 3.6
  • 不是 f 字符串,而是 \N{name} 转义序列。
  • 这似乎是一个好方法,但有没有办法使用变量呢?即如果我有power = 5,我怎样才能让它打印γ=5.00 t/m⁵
【解决方案3】:

您可以使用 sympy 模块为您进行必要的格式化。支持ascii、unicode、latex、mathml等多种格式:

from sympy import pretty_print as pp, latex
from sympy.abc import a, b, n

expr = (a*b)**n
pp(expr) # default
pp(expr, use_unicode=True)
print(latex(expr))
print(expr.evalf(subs=dict(a=2,b=4,n=5)))

输出

     n
(a*b) 
     n
(a⋅b) 
$\left(a b\right)^{n}$
32768.0000000000

【讨论】:

    【解决方案4】:

    对于那些寻求实用(但有点不完美)UTF-8-based 解决方案的人,使用简单的字符转换表实现:

    import string
    
    superscript_map = {
        "0": "⁰", "1": "¹", "2": "²", "3": "³", "4": "⁴", "5": "⁵", "6": "⁶",
        "7": "⁷", "8": "⁸", "9": "⁹", "a": "ᵃ", "b": "ᵇ", "c": "ᶜ", "d": "ᵈ",
        "e": "ᵉ", "f": "ᶠ", "g": "ᵍ", "h": "ʰ", "i": "ᶦ", "j": "ʲ", "k": "ᵏ",
        "l": "ˡ", "m": "ᵐ", "n": "ⁿ", "o": "ᵒ", "p": "ᵖ", "q": "۹", "r": "ʳ",
        "s": "ˢ", "t": "ᵗ", "u": "ᵘ", "v": "ᵛ", "w": "ʷ", "x": "ˣ", "y": "ʸ",
        "z": "ᶻ", "A": "ᴬ", "B": "ᴮ", "C": "ᶜ", "D": "ᴰ", "E": "ᴱ", "F": "ᶠ",
        "G": "ᴳ", "H": "ᴴ", "I": "ᴵ", "J": "ᴶ", "K": "ᴷ", "L": "ᴸ", "M": "ᴹ",
        "N": "ᴺ", "O": "ᴼ", "P": "ᴾ", "Q": "Q", "R": "ᴿ", "S": "ˢ", "T": "ᵀ",
        "U": "ᵁ", "V": "ⱽ", "W": "ᵂ", "X": "ˣ", "Y": "ʸ", "Z": "ᶻ", "+": "⁺",
        "-": "⁻", "=": "⁼", "(": "⁽", ")": "⁾"}
    
    trans = str.maketrans(
        ''.join(superscript_map.keys()),
        ''.join(superscript_map.values()))
    
    'The quick brown fox jumps over the lazy dog'.translate(trans)
    # ᵀʰᵉ ۹ᵘᶦᶜᵏ ᵇʳᵒʷⁿ ᶠᵒˣ ʲᵘᵐᵖˢ ᵒᵛᵉʳ ᵗʰᵉ ˡᵃᶻʸ ᵈᵒᵍ
    

    作为奖励,这里是对应的下标:

    subscript_map = {
        "0": "₀", "1": "₁", "2": "₂", "3": "₃", "4": "₄", "5": "₅", "6": "₆",
        "7": "₇", "8": "₈", "9": "₉", "a": "ₐ", "b": "♭", "c": "꜀", "d": "ᑯ",
        "e": "ₑ", "f": "բ", "g": "₉", "h": "ₕ", "i": "ᵢ", "j": "ⱼ", "k": "ₖ",
        "l": "ₗ", "m": "ₘ", "n": "ₙ", "o": "ₒ", "p": "ₚ", "q": "૧", "r": "ᵣ",
        "s": "ₛ", "t": "ₜ", "u": "ᵤ", "v": "ᵥ", "w": "w", "x": "ₓ", "y": "ᵧ",
        "z": "₂", "A": "ₐ", "B": "₈", "C": "C", "D": "D", "E": "ₑ", "F": "բ",
        "G": "G", "H": "ₕ", "I": "ᵢ", "J": "ⱼ", "K": "ₖ", "L": "ₗ", "M": "ₘ",
        "N": "ₙ", "O": "ₒ", "P": "ₚ", "Q": "Q", "R": "ᵣ", "S": "ₛ", "T": "ₜ",
        "U": "ᵤ", "V": "ᵥ", "W": "w", "X": "ₓ", "Y": "ᵧ", "Z": "Z", "+": "₊",
        "-": "₋", "=": "₌", "(": "₍", ")": "₎"}
    
    
    sub_trans = str.maketrans(
        ''.join(subscript_map.keys()),
        ''.join(subscript_map.values()))
    
    'The quick brown fox jumps over the lazy dog'.translate(sub_trans)
    # 'ₜₕₑ ૧ᵤᵢ꜀ₖ ♭ᵣₒwₙ բₒₓ ⱼᵤₘₚₛ ₒᵥₑᵣ ₜₕₑ ₗₐ₂ᵧ ᑯₒ₉'
    

    同样,不完美,但可行。

    【讨论】:

    • 数字上标写在不同的高度。例如 0 大于 1(至少在使用 ipycanvas 时)
    • @Daniel 这些数字实际上是 UTF-8 支持的。因此,如果存在渲染问题,则很可能与字体有关。也许你可以尝试不同的字体。
    • 我在普通文本中看到了它们:⁰¹²³⁴⁵⁶⁷⁸⁹,但在代码中没有:⁰¹²³⁴⁵⁶⁷⁸⁹ 其中123 似乎比其他文本稍大。
    • 可爱。谢谢@norck2
    • @norok2,奇怪的是,我没有看到您在行中发布的正常文本符号(1、2 和 3 有点低)。可能是你说的字体问题。
    【解决方案5】:

    您使用的是input(),所以我想这是基于控制台的。为此,您有两个选择,如前所述 here。一种是使用一些格式化技巧来在实际展开式上方的行上显示指数。另一种是使用这些漂亮的字符,假设你的控制台支持 Unicode:

    ⁰¹²³⁴⁵⁶⁷⁸⁹
    

    您可能必须将字体大小增加相当多才能使其清晰易读,但如果有适当的支持,这肯定是一个可行的选择。不过,除此之外,您提到这是个人的学习经历;为什么不将它与另一个结合起来学习 Pygame 更简单的方面呢?它非常简单,文本操作和键盘事件再简单不过了,而且分支永远不会出错。

    【讨论】:

      【解决方案6】:

      由于我无法确定,Python 中不存在字符串解析之类的东西,我能想到的最直接的解决方案就是加入一个通过 str() 运行您的号码获得的字符列表和查找表。我认为没有理由不将上标的 unicode 字符串用作文字。只需减去 '0' 值的偏移量,您就可以在字符串中找到上标替换的索引。

      def superscript(n):
          return "".join(["⁰¹²³⁴⁵⁶⁷⁸⁹"[ord(c)-ord('0')] for c in str(n)]) 
      

      【讨论】:

        【解决方案7】:

        Unicode 字符是解决方案!


        有一种非常简单的方法可以使用 Unicode 字符打印上标和下标。执行以下操作:

        • 按 alt+f2
        • 输入“charmap”

        这样做后,您将获得大量字符,包括下标、上标等。在窗口的左下端,您会看到类似“U-xxxx”的内容,其中 x 可以是任何字母数字字符(例如 1,2,A,B..)。

        例如:

        • 如果你想打印一个字符串 x^2,你应该把字符串写成:

          'x\u00b2',其中 u00b2 是字符映射中显示的 'U+00B2'。

        这就是我在我的 tkinter 代码 sn-p 中使用字符映射的方式,它可以正常工作。

        【讨论】:

        • 必须仅适用于某些单一平台。视窗?如果是:您只能在支持它们的字体中找到这些字符(然后我建议使用 Arial MS Unicode)。但是由于 OP 想要创建一个基于控制台的程序,这些相同的字符也必须在控制台字体中可用。
        • 我使用的是 Ubuntu 18.04,它在这里工作,我不知道 windows
        【解决方案8】:

        你可以用这个:

        def conv_to_super(n):
            super=list(map(chr,[8304,185,178,179,8308,8309,8310,8311,8312,8313]))
            st=""
            for i in str(n):
                st+=super[int(i)]
            return(st)
        
        

        【讨论】:

          【解决方案9】:

          您的 Python 程序可能作为控制台应用程序运行,它只能输出不带格式的字符。你的问题的简单答案是“你做不到”。

          当然可以编写一个 GUI 应用程序,将我们的输出转换为支持格式化(RTF、HTML、TeX 等)的文档格式,但这很可能超出了您正在处理的作业问题的范围。

          【讨论】:

          • 感谢您的回复,但不,我打算在没有 GUI 的情况下编写程序的准系统,然后一旦我对一切正常工作感到满意,我将为它创建一个 GUI。我打算将 tkinter 用于我的 GUI,那么可以使用 tkinter 吗?如果不是,哪个模块适合?
          【解决方案10】:

          正如 MK 已经说过的,您不能在命令行上格式化输出(除了某些颜色和粗体/闪烁,具体取决于终端)。但是,您可以以用户可能理解的方式编写它。如果他们来自学术界,您可以使用乳胶风格的方式来表达上标,例如x^2

          【讨论】:

            【解决方案11】:

            您可以使用平铺位图,而不是使用控制台文本。制作一组瓷砖。然后在后端进行计算。如果控制台文本是固定的,请切换屏幕模式并使用您自己的字符集。只是深夜的想法。

            【讨论】:

            • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
            • 我建议不要在答案中使用修辞问题。他们冒着被误解为根本不是答案的风险。您正在尝试回答此页面顶部的问题,不是吗?否则请删除此帖。
            【解决方案12】:

            使用pow 使某事变得强大

            例如:

            emi = (p * r * pow(1 + r, t)) / (pow(1 + r, t) - 1)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-08-15
              • 1970-01-01
              • 2019-09-01
              • 2012-03-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多