How do you print superscript in Python?

103,725

Solution 1

You could use sympy module that does necessary formatting for you. It supports many formats such as ascii, unicode, latex, mathml, etc:

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)))

Output

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

Solution 2

You need to use a 'format' type thing. Use {}\u00b2".format(area))" and the{}becomes a²`. Here is an example:

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

The end of the code will print cm². You can change the large 2 at the end to other numbers for a different result. I do not know how to do a lower subscript though.

Solution 3

In Python 3.6+ (mentioned only because the example uses f-strings that are not available in previous versions) named Unicode characters provide an easy to write, easy to read way to do this. Here is a list.

Example:

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

yields something like

γ=1.20 t/m³

Solution 4

For those looking for a practical (but a bit imperfect) UTF-8-based solution, implemented using a simple character translation table:

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)
# ᵀʰᵉ ۹ᵘᶦᶜᵏ ᵇʳᵒʷⁿ ᶠᵒˣ ʲᵘᵐᵖˢ ᵒᵛᵉʳ ᵗʰᵉ ˡᵃᶻʸ ᵈᵒᵍ

As a bonus, here is the subscript counterpart:

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

Again, not perfect, but workable.

Solution 5

You're using input(), so I imagine this is console-based. To that end, you have two options, as previously discussed here. One is to use a bit of formatting trickery to display the exponents on the line above the actual expansion. The other is to use these nifty characters, assuming your console supports Unicode:

⁰¹²³⁴⁵⁶⁷⁸⁹

You're probably going to have to increase the font size by quite a bit for them to be legible, but it's certainly a viable option assuming proper support. Aside from that, though, you mentioned this is a personal learning experience; why not combine it with another and learn the simpler aspects of Pygame? It's very straightforward, text manipulation and keyboard events couldn't be simpler, and it's never a wrong step to branch out.

Share:
103,725
Kage93
Author by

Kage93

Updated on November 19, 2021

Comments

  • Kage93
    Kage93 over 2 years

    I am aware of the \xb function in python, but it does not seem to work for me. I am aware that I may need to download a third party module to accomplish this, if so, which one would be best?

    I am currently writing a binomial expansion solver, to try and use skills which I am teaching myself. The problem arises when I attempt to display the user input-ed expansion to the use for confirmation. Currently I am having to print the expression like so:

    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 "))
    

    This prints (2x4)^5, whereas I'd prefer the index to be printed as superscript. How can this be done?

  • Kage93
    Kage93 over 12 years
    Thanks for the reply, but no, I intend to write the barebones of the program without a GUI then once I am satisfied that everything works, I will create a GUI for it. I plan on using tkinter for my GUI, would it be possible using tkinter then? If not, which module would be suitable?
  • skrx
    skrx about 6 years
    This actually works since Python 3.3.
  • jake77
    jake77 about 6 years
    No, it doesn't: since 3.6
  • skrx
    skrx about 6 years
    Not the f-strings, the \N{name} escape sequence.
  • Jongware
    Jongware over 5 years
    This must be for some single platform only. Windows? If it is: you can only find those characters in fonts that support them (and I'd then advise using Arial MS Unicode). But since OP wants to create a console based program, those same characters must also be available in the console font.
  • TheSHETTY-Paradise
    TheSHETTY-Paradise over 5 years
    I use Ubuntu 18.04 and it works here, I'm unaware of windows
  • Eduardo Pignatelli
    Eduardo Pignatelli about 4 years
    > You can change the large 2 at the end to other numbers for a different result. This is not true. While \u00b3 returns ³, \u00b4 returns ´, \u00b5 returns µ.
  • Daniel
    Daniel almost 4 years
    The number superscripts are written at different heights. For example 0 is higher than 1 (at least when using ipycanvas)
  • norok2
    norok2 almost 4 years
    @Daniel The numbers are actually supported by UTF-8. So, if there is a rendering issue, it is likely to be with the fonts. Perhaps you could try different fonts.
  • norok2
    norok2 almost 4 years
    I see them in line here in the normal text: ⁰¹²³⁴⁵⁶⁷⁸⁹ but not in the code: ⁰¹²³⁴⁵⁶⁷⁸⁹ where 123 seems slightly larger than the others.
  • Zanoldor
    Zanoldor almost 4 years
    Lovely. Thanks @norck2
  • Daniel
    Daniel over 3 years
    @norok2, strangely, I don't see the normal text symbols you posted in line (1, 2 and 3 are a bit lower). Probably a font issue as you said.
  • frakman1
    frakman1 over 3 years
    How do I make both subscript and superscript text appear in the same spot? i.e. one character directly above the other.
  • norok2
    norok2 over 3 years
    @frakman1 UTF-8 was not really designed for this. While some fonts may support this via OpenType using the unicode private area, you should really look into another option. See also en.wikipedia.org/wiki/Subscript_and_superscript
  • frakman1
    frakman1 over 3 years
    @norok2. Thanks. I just thought this would be a common use-case for scientific formulas and chemistry elements
  • Tomerikoo
    Tomerikoo almost 3 years
    This seems like a good way but is there a way to use variables with this? i.e. if I have power = 5 how can I make it print γ=5.00 t/m⁵?
  • Admin
    Admin over 2 years
    As it’s currently written, your answer is unclear. Please edit to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center.
  • Yunnosch
    Yunnosch over 2 years
    I recommend against rhetoric questions in answers. They risk being misunderstood as not an answer at all. You are trying to answer the question at the top of this page, aren't you? Otherwise please delete this post.