如何打印上标?

32
我知道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,而我希望指数以上标形式打印出来。如何实现这个要求?

5
请指定输出设备/格式,因为这将决定上标如何标记。例如,在HTML中,您需要输出(2x4)<sup>5</sup> - Peter Rowell
еңЁPython 2.xдёӯдёҚиҰҒдҪҝз”Ёinput()пјҢиҖҢеә”иҜҘдҪҝз”Ёint(raw_input())гҖӮеҗҰеҲҷиҜ·жҢҮжҳҺжӮЁдҪҝз”Ёзҡ„жҳҜPython 3.xгҖӮ - jfs
13个回答

35

你需要使用一种“格式”类型的东西。使用 {}\u00b2".format(area))",其中{}变成了²。这里有一个例子:

print("The area of your rectangle is {}cm\u00b2".format(area))
代码的结尾将打印 cm² 。您可以更改末尾的大号数字以获得不同的结果。虽然我不知道如何做下标。

8
你可以将末尾的大数字2更改为其他数字以获得不同的结果,这是不正确的。虽然\u00b3返回³,但\u00b4返回´\u00b5返回µ - Eduardo Pignatelli
1
如果你正在寻找其他字符,这个链接可能会有所帮助:https://en.wikibooks.org/wiki/Unicode/List_of_useful_symbols#Superscript_and_Subscript_Numbers。虽然有些晚了几年,但仍然是一个有用的链接。 - undefined

25
在Python 3.6+中(仅因示例使用了f-strings,而此功能在之前的版本中不可用),命名的Unicode字符提供了一种易于编写、易于阅读的方法来实现这一点。这里是列表。
示例:
f'\N{GREEK SMALL LETTER GAMMA}={density:.2f} t/m\N{SUPERSCRIPT THREE}'

产生的结果类似于。
γ=1.20 t/m³

3
Python 3.3起,这个方法确实可行。 - skrx
2
不,它不会:自3.6版本以来 - jake77
6
不是使用f-strings,而是使用\N{name}转义序列。 - skrx
这似乎是一个不错的方法,但有没有办法使用变量呢?例如,如果我有 power = 5,如何使其打印出 γ=5.00 t/m⁵ - Tomerikoo
不适用于3.11,我认为它相当过时。 - Aku
对于那些想要替换字符串中的上标的人,只是提供一下信息,使用jake77的示例可以实现。 'df1.str.replace( r'\N{SUPERSCRIPT TWO}',''',regex =True) - Nick_Jo

16

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

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ₙ բₒₓ ⱼᵤₘₚₛ ₒᵥₑᵣ ₜₕₑ ₗₐ₂ᵧ ᑯₒ₉'

虽然不是完美的,但还是可以使用的。


@Daniel,数字实际上是由UTF-8支持的。因此,如果存在渲染问题,则很可能与字体有关。也许您可以尝试不同的字体。 - norok2
我在普通文本中看到它们排成一行:⁰¹²³⁴⁵⁶⁷⁸⁹,但在代码中却没有:⁰¹²³⁴⁵⁶⁷⁸⁹,其中的 123 看起来比其他数字略大。 - norok2
1
太好了。谢谢 @norck2 - Zanoldor
@frakman1,UTF-8 实际上并不是为此而设计的。虽然一些字体可能通过使用 Unicode 私有区域的 OpenType 支持此功能,但您应该真正考虑另一个选项。另请参阅 https://en.wikipedia.org/wiki/Subscript_and_superscript。 - norok2
问题在于不同的上标和下标不幸地驻留在不同的Unicode块中。许多字体都很难处理这个问题。例如,1、2和3的上标位于“Latin-1 Supplement”块中,而0、4、5、6、7、8和9的上标则属于“Superscripts and Subscripts”块。随着字母的增加,情况变得更加复杂,正如您在上面所看到的。 - Joooeey
显示剩余4条评论

13

你可以使用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

8

由于我无法确定任何原因,Python中没有字符串推导,我能想到的最直接的解决方案就是通过运行数字并使用查找表将字符列表连接起来。我认为可以毫不犹豫地使用Unicode作为上标字面值字符串。只需减去“0”值的偏移量,您就可以在字符串中找到上标替换的索引。

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

6

Unicode字符就是解决方案!


使用Unicode字符打印上标和下标有一种非常简单的方法。请按照以下步骤操作:

  • 按下 Alt+F2
  • 输入 "charmap"

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

例如:

  • 如果您想要打印像这样的字符串,则应将字符串写为:

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

这就是我在我的tkinter代码片段中使用字符映射的方式,它可以正常工作而没有任何错误。


1
这一定是针对某个单一平台。Windows?如果是的话:您只能在支持它们的字体中找到这些字符(我建议使用Arial MS Unicode)。但由于OP想要创建一个基于控制台的程序,那么这些同样的字符也必须在控制台字体中可用。 - Jongware
1
我使用Ubuntu 18.04,它在这里运行良好,我不知道Windows。 - TheSHETTY-Paradise

4
你正在使用input(),所以我想这是基于控制台的。为此,你有两个选项,如先前在这里讨论过的。一个是使用一些格式技巧,在实际扩展的上面一行显示指数。另一个是使用这些漂亮的字符,假设你的控制台支持Unicode:
⁰¹²³⁴⁵⁶⁷⁸⁹

你可能需要将字体大小增加很多才能使它们可读,但是如果有适当的支持,这肯定是一个可行的选项。除此之外,你提到这是一个个人学习经历;为什么不将其与另一个项目结合起来,学习Pygame的简单方面呢?它非常直观,文本操作和键盘事件非常简单,而且拓展自己从来都不会是错误的步骤。


1
你可以使用这个:

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)


0

你可以使用瓷砖位图代替控制台文本。创建一个瓷砖数组,然后在后端进行计算。如果控制台文本过于死板,可以切换屏幕模式并使用自己的字符集。这只是一个深夜的想法。


1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community
我建议在回答中不要使用修辞性问题。它们可能会被误解为根本不是答案。你是在尝试回答这个页面顶部的问题,对吗?否则请删除此帖子。 - Yunnosch

0

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

当然,可以编写GUI应用程序,或者输出支持格式化的文档格式(RTF、HTML、TeX等),但这很可能超出了你正在处理的作业问题的范围。


谢谢回复,但不,我打算先编写程序的基本框架,没有图形用户界面,一旦我满意一切都正常工作,我会为其创建一个GUI。我计划使用tkinter来制作GUI,那么使用tkinter是否可能呢?如果不行,哪个模块会更适合呢? - Kage93

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接