エジプト数字に変換する#

%%ai vioras
ロゼッタストーンとベヒストゥン碑文について

ロゼッタストーンとベヒストゥン碑文は、古代の言語を解読するための重要な手がかりとなった記念碑です。

ロゼッタストーン

ロゼッタストーンは、紀元前196年のエジプト、プトレマイオス5世の時代の碑文です。この碑文は、古代エジプトのヒエログリフ、デモティック(エジプトの民間文書で使われた書体)、ギリシャ語の3つの言語・文字体系で書かれています。すべて同じ内容を伝えています。この3つの言語が同じ内容を伝える形で記されていることから、比較研究が可能となり、古代エジプトのヒエログリフが解読されるきっかけとなりました。この碑文は、フランスのナポレオン・ボナパルトがエジプトを侵略した際に発見され、現在はイギリスの大英博物館に収蔵されています。

ベヒストゥン碑文

ベヒストゥン碑文は、紀元前520年ごろのペルシアのダレイオス1世の時代の碑文です。この碑文は、バビロニアの楔形文字、エラム語(古代イランの言語)、古代ペルシャ語の3つの言語・文字体系で書かれています。すべて同じ内容を伝えています。これも3つの言語が同じ内容を伝える形で記されていることから、比較研究が可能となり、古代ペルシャ語の楔形文字が解読されるきっかけとなりました。この碑文は、イランのベヒストゥン山に刻まれており、現地で見ることができます。

これらの碑文を通じて、古代の言語が解読され、歴史研究や言語学研究に大きな進歩をもたらしました。

WikipediaからUnicodeコードポイント表を読み込む#

!pip install -U lxml
Collecting lxml
  Downloading lxml-5.2.2-cp311-cp311-manylinux_2_28_x86_64.whl.metadata (3.4 kB)
Downloading lxml-5.2.2-cp311-cp311-manylinux_2_28_x86_64.whl (5.0 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 5.0/5.0 MB 62.2 MB/s eta 0:00:00:00:0100:01
?25hInstalling collected packages: lxml
Successfully installed lxml-5.2.2
import pandas as pd
dfs = pd.read_html('https://en.wikipedia.org/wiki/Egyptian_Hieroglyphs_(Unicode_block)')
dfs[1]
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
0 Egyptian Hieroglyphs[1] Official Unicode Conso... Egyptian Hieroglyphs[1] Official Unicode Conso... Egyptian Hieroglyphs[1] Official Unicode Conso... Egyptian Hieroglyphs[1] Official Unicode Conso... Egyptian Hieroglyphs[1] Official Unicode Conso... Egyptian Hieroglyphs[1] Official Unicode Conso... Egyptian Hieroglyphs[1] Official Unicode Conso... Egyptian Hieroglyphs[1] Official Unicode Conso... Egyptian Hieroglyphs[1] Official Unicode Conso... Egyptian Hieroglyphs[1] Official Unicode Conso... Egyptian Hieroglyphs[1] Official Unicode Conso... Egyptian Hieroglyphs[1] Official Unicode Conso... Egyptian Hieroglyphs[1] Official Unicode Conso... Egyptian Hieroglyphs[1] Official Unicode Conso... Egyptian Hieroglyphs[1] Official Unicode Conso... Egyptian Hieroglyphs[1] Official Unicode Conso... Egyptian Hieroglyphs[1] Official Unicode Conso...
1 NaN 0 1 2 3 4 5 6 7 8 9 A B C D E F
2 U+1300x 𓀀 𓀁 𓀂 𓀃 𓀄 𓀅 𓀆 𓀇 𓀈 𓀉 𓀊 𓀋 𓀌 𓀍 𓀎 𓀏
3 U+1301x 𓀐 𓀑 𓀒 𓀓 𓀔 𓀕 𓀖 𓀗 𓀘 𓀙 𓀚 𓀛 𓀜 𓀝 𓀞 𓀟
4 U+1302x 𓀠 𓀡 𓀢 𓀣 𓀤 𓀥 𓀦 𓀧 𓀨 𓀩 𓀪 𓀫 𓀬 𓀭 𓀮 𓀯
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
65 U+133Fx 𓏰 𓏱 𓏲 𓏳 𓏴 𓏵 𓏶 𓏷 𓏸 𓏹 𓏺 𓏻 𓏼 𓏽 𓏾 𓏿
66 U+1340x 𓐀 𓐁 𓐂 𓐃 𓐄 𓐅 𓐆 𓐇 𓐈 𓐉 𓐊 𓐋 𓐌 𓐍 𓐎 𓐏
67 U+1341x 𓐐 𓐑 𓐒 𓐓 𓐔 𓐕 𓐖 𓐗 𓐘 𓐙 𓐚 𓐛 𓐜 𓐝 𓐞 𓐟
68 U+1342x 𓐠 𓐡 𓐢 𓐣 𓐤 𓐥 𓐦 𓐧 𓐨 𓐩 𓐪 𓐫 𓐬 𓐭 𓐮 𓐯
69 Notes 1.^ As of Unicode version 15.1 Notes 1.^ As of Unicode version 15.1 Notes 1.^ As of Unicode version 15.1 Notes 1.^ As of Unicode version 15.1 Notes 1.^ As of Unicode version 15.1 Notes 1.^ As of Unicode version 15.1 Notes 1.^ As of Unicode version 15.1 Notes 1.^ As of Unicode version 15.1 Notes 1.^ As of Unicode version 15.1 Notes 1.^ As of Unicode version 15.1 Notes 1.^ As of Unicode version 15.1 Notes 1.^ As of Unicode version 15.1 Notes 1.^ As of Unicode version 15.1 Notes 1.^ As of Unicode version 15.1 Notes 1.^ As of Unicode version 15.1 Notes 1.^ As of Unicode version 15.1 Notes 1.^ As of Unicode version 15.1

70 rows × 17 columns

Pandasのテーブルの参照#

%%ai vioras
pandasのデータフレームのx行目y列のデータを参照したい

Pandasのデータフレームから特定の行と列のデータを参照するには、ilocatを使用できます。

例えば、dataframeという名前のデータフレームがあり、その中からx行目y列のデータを取り出したいとすると、以下のようにします:

# ilocを使用する場合
value = dataframe.iloc[x-1, y-1]  # 行と列は0から始まるので、1を引く。

# atを使用する場合
row_label = dataframe.index[x-1]  # 行ラベルを取得
column_label = dataframe.columns[y-1]  # 列ラベルを取得
value = dataframe.at[row_label, column_label]  # 行ラベルと列ラベルを指定して値を取得

ここで、x-1y-1を使用している理由は、Pythonではインデックスが0から始まるためです。したがって、”1行目”はPythonでは”0行目”になります。

また、atメソッドは、特定の行と列のラベルを指定して値を取得するためのもので、ilocよりも高速に動作することが知られています。ただし、一度に一つのセルの値のみを取得できます。

なお、これらの方法はデータフレームから値を参照するためのもので、値を変更するためには別の方法を使用する必要があります。

%%ai vioras
jupyterで一個前のセルの出力を参照したい

Jupyterノートブックでは、アンダースコア _ を使用して直前のセルの出力を参照することができます。例えば:

3 + 4

上記のセルを実行すると、出力は 7 です。次のセルで _ を使用すれば、その結果を引き続き使用することができます:

print(_)  # これは '7' を出力します

一方、_NN はセルの実行番号)を使用すると、特定のセルの出力を参照することもできます。例えば、2つ目のセルの出力を参照したい場合は、_2 を使います。

ただし、これらの方法はすべての種類の出力に対して機能するわけではないことに注意してください。具体的には、表示(print)関数を使用して出力した結果は参照できません。これらの方法は、セルの最後の行で評価された結果を参照します。

dfs[1].iloc[65, 11]
'𓏺'
_
'𓏺'

Unicodeコードポイントと文字表現の変換#

%%ai vioras
文字列のユニコードのコードポイントを16進数で表示したい

Pythonでは、ord()関数とhex()関数を組み合わせて、文字列のUnicodeのコードポイントを16進数で表示することができます。ord()関数は文字のUnicodeコードポイントを取得し、hex()関数はその整数値を16進数の文字列に変換します。

以下に例を示します:

s = 'あ'
codepoint = ord(s)
hex_codepoint = hex(codepoint)
print(hex_codepoint)

このコードは、Unicode文字 ‘あ’ のコードポイントを16進数で表示します。

複数の文字からなる文字列の各文字のコードポイントを16進数で表示するには、文字列をループで処理します:

s = 'こんにちは'
for char in s:
    print(f'The hexadecimal codepoint of {char} is {hex(ord(char))}')

このコードは、文字列 ‘こんにちは’ の各文字のUnicodeコードポイントを16進数で表示します。

なお、ord()関数は単一のUnicode文字に対してのみ動作し、複数の文字からなる文字列を引数に取ることはできません。複数の文字からなる文字列のコードポイントを取得するには、文字列を一文字ずつ処理する必要があります。

s = 'あ'
codepoint = ord(s)
hex_codepoint = hex(codepoint)
print(hex_codepoint)
0x3042
%%ai vioras
コードポイントをユニコードエスケープされたraw文字列で表示する

ユニコードエスケープされた文字列を表示するには、Pythonの組み込み関数であるchr()format()を使用できます。これにより、ユニコードのコードポイントを対応する文字に変換し、そのユニコードエスケープされた表現を得ることができます。

たとえば、コードポイント12354(これは「あ」に対応します)をユニコードエスケープされた文字列で表示するには、以下のようにします:

codepoint = 12354
unicode_char = chr(codepoint)
escaped_unicode_string = unicode_char.encode('unicode_escape').decode()
print(escaped_unicode_string)

このコードは、コードポイント12354をユニコード文字「あ」に変換し、そのユニコードエスケープされた表現(\u3042)を表示します。

この方法では、任意のコードポイントをユニコードエスケープされた文字列に変換できます。

それぞれの桁の最初の数をコードポイント表から探す#

1#

dfs[1].iloc[65, 11]
'𓏺'
hex(ord(_))
'0x133fa'
_.encode('unicode-escape')
b'\\U000133fa'
_.decode()
'\\U000133fa'
u'\U000133fa'
'𓏺'

10#

dfs[1].iloc[58, 7]
'𓎆'
_.encode('unicode-escape')
b'\\U00013386'

100#

dfs[1].iloc[56, 3]
'𓍢'
_.encode('unicode-escape')
b'\\U00013362'

1,000#

dfs[1].iloc[29,13]
'𓆼'
_.encode('unicode-escape')
b'\\U000131bc'

10,000#

dfs[1].iloc[12, 14]
'𓂭'
_.encode('unicode-escape')
b'\\U000130ad'

100,000#

dfs[1].iloc[27, 1]
'𓆐'
_.encode('unicode-escape')
b'\\U00013190'

1,000,000#

dfs[1].iloc[8, 9]
'𓁨'
_.encode('unicode-escape')
b'\\U00013068'

10進数をエジプト数字に変換する#

%%ai vioras
コードポイントが連続した文字を列挙する方法

Pythonのchr()関数とrange()関数を使うと、連続したUnicodeコードポイントの文字列を生成することができます。chr()関数はコードポイントを文字に変換し、range()関数は指定した範囲の連続した整数を生成します。

例えば、ASCIIの英小文字(’a’から’z’)を列挙するには、以下のようにします:

for codepoint in range(ord('a'), ord('z') + 1):
    print(chr(codepoint), end=' ')

これは、’a’から’z’までの英小文字を空白で区切って表示します。ord('a')ord('z') + 1は、それぞれ’a’と’z’のUnicodeコードポイントを取得します。range()関数は終点を含まないので、’z’を含めるためには終点に1を足す必要があります。

また、任意の範囲のUnicode文字を列挙するには、コードポイントの範囲を直接指定します。例えば、ひらがな(Unicodeコードポイントは’3040’から’309F’)を列挙するには、以下のようにします:

for codepoint in range(0x3040, 0x309F + 1):
    print(chr(codepoint), end=' ')

これは、Unicodeコードポイントが’3040’から’309F’の範囲の文字を空白で区切って表示します。16進数の数値はPythonでは0xを前につけて表現します。

egyptian_numerals = {}
for i in range(ord('\U000133fa'), ord('\U000133fa')+9):
    print(hex(i), chr(i))
0x133fa 𓏺
0x133fb 𓏻
0x133fc 𓏼
0x133fd 𓏽
0x133fe 𓏾
0x133ff 𓏿
0x13400 𓐀
0x13401 𓐁
0x13402 𓐂
for i in range(1, 10):
    print(i, chr(ord('\U000133fa')-1+i))
    egyptian_numerals[i] = chr(ord('\U000133fa')-1+i)
egyptian_numerals
1 𓏺
2 𓏻
3 𓏼
4 𓏽
5 𓏾
6 𓏿
7 𓐀
8 𓐁
9 𓐂
{1: '𓏺', 2: '𓏻', 3: '𓏼', 4: '𓏽', 5: '𓏾', 6: '𓏿', 7: '𓐀', 8: '𓐁', 9: '𓐂'}
for i in range(1, 10):
    print(i*10, chr(ord('\U00013386')-1+i))
    egyptian_numerals[i*10] = chr(ord('\U00013386')-1+i)
egyptian_numerals
10 𓎆
20 𓎇
30 𓎈
40 𓎉
50 𓎊
60 𓎋
70 𓎌
80 𓎍
90 𓎎
{1: '𓏺',
 2: '𓏻',
 3: '𓏼',
 4: '𓏽',
 5: '𓏾',
 6: '𓏿',
 7: '𓐀',
 8: '𓐁',
 9: '𓐂',
 10: '𓎆',
 20: '𓎇',
 30: '𓎈',
 40: '𓎉',
 50: '𓎊',
 60: '𓎋',
 70: '𓎌',
 80: '𓎍',
 90: '𓎎'}
for i in range(1, 10):
    print(i*100, chr(ord('\U00013362')-1+i))
    egyptian_numerals[i*100] = chr(ord('\U00013362')-1+i)
egyptian_numerals
100 𓍢
200 𓍣
300 𓍤
400 𓍥
500 𓍦
600 𓍧
700 𓍨
800 𓍩
900 𓍪
{1: '𓏺',
 2: '𓏻',
 3: '𓏼',
 4: '𓏽',
 5: '𓏾',
 6: '𓏿',
 7: '𓐀',
 8: '𓐁',
 9: '𓐂',
 10: '𓎆',
 20: '𓎇',
 30: '𓎈',
 40: '𓎉',
 50: '𓎊',
 60: '𓎋',
 70: '𓎌',
 80: '𓎍',
 90: '𓎎',
 100: '𓍢',
 200: '𓍣',
 300: '𓍤',
 400: '𓍥',
 500: '𓍦',
 600: '𓍧',
 700: '𓍨',
 800: '𓍩',
 900: '𓍪'}
for i in range(1, 10):
    print(i*1000, chr(ord('\U000131bc')-1+i))
    egyptian_numerals[i*1000] = chr(ord('\U000131bc')-1+i)
egyptian_numerals
1000 𓆼
2000 𓆽
3000 𓆾
4000 𓆿
5000 𓇀
6000 𓇁
7000 𓇂
8000 𓇃
9000 𓇄
{1: '𓏺',
 2: '𓏻',
 3: '𓏼',
 4: '𓏽',
 5: '𓏾',
 6: '𓏿',
 7: '𓐀',
 8: '𓐁',
 9: '𓐂',
 10: '𓎆',
 20: '𓎇',
 30: '𓎈',
 40: '𓎉',
 50: '𓎊',
 60: '𓎋',
 70: '𓎌',
 80: '𓎍',
 90: '𓎎',
 100: '𓍢',
 200: '𓍣',
 300: '𓍤',
 400: '𓍥',
 500: '𓍦',
 600: '𓍧',
 700: '𓍨',
 800: '𓍩',
 900: '𓍪',
 1000: '𓆼',
 2000: '𓆽',
 3000: '𓆾',
 4000: '𓆿',
 5000: '𓇀',
 6000: '𓇁',
 7000: '𓇂',
 8000: '𓇃',
 9000: '𓇄'}
for i in range(1, 10):
    print(i*10000, chr(ord('\U000130ad')-1+i))
    egyptian_numerals[i*10000] = chr(ord('\U000130ad')-1+i)
egyptian_numerals
10000 𓂭
20000 𓂮
30000 𓂯
40000 𓂰
50000 𓂱
60000 𓂲
70000 𓂳
80000 𓂴
90000 𓂵
{1: '𓏺',
 2: '𓏻',
 3: '𓏼',
 4: '𓏽',
 5: '𓏾',
 6: '𓏿',
 7: '𓐀',
 8: '𓐁',
 9: '𓐂',
 10: '𓎆',
 20: '𓎇',
 30: '𓎈',
 40: '𓎉',
 50: '𓎊',
 60: '𓎋',
 70: '𓎌',
 80: '𓎍',
 90: '𓎎',
 100: '𓍢',
 200: '𓍣',
 300: '𓍤',
 400: '𓍥',
 500: '𓍦',
 600: '𓍧',
 700: '𓍨',
 800: '𓍩',
 900: '𓍪',
 1000: '𓆼',
 2000: '𓆽',
 3000: '𓆾',
 4000: '𓆿',
 5000: '𓇀',
 6000: '𓇁',
 7000: '𓇂',
 8000: '𓇃',
 9000: '𓇄',
 10000: '𓂭',
 20000: '𓂮',
 30000: '𓂯',
 40000: '𓂰',
 50000: '𓂱',
 60000: '𓂲',
 70000: '𓂳',
 80000: '𓂴',
 90000: '𓂵'}
def decimal_to_egyptian(num):
    result = ''
    for value in sorted(egyptian_numerals.keys(), reverse=True):
        while num >= value:
            result += egyptian_numerals[value]
            num -= value
    return result
decimal_to_egyptian(4622)
'𓆿𓍧𓎇𓏻'

ord()chr() による文字とコードポイントの変換#

%%ai vioras
`ord()`が必要な理由

Pythonのord()関数は、特定の一つのUnicode文字を表す文字列を引数に取り、その文字のUnicodeコードポイントを整数として返す関数です。Unicodeコードポイントとは、各Unicode文字に一意に割り当てられた数値のことを指します。

ord()関数が必要な理由は、文字とその背後の数値表現(つまりコードポイント)との間の変換を可能にするためです。この変換は、文字データを扱う際のさまざまなタスクで必要とされます。たとえば、その文字のバイナリ表現を取得したり、文字の並び替え順(コードポイントの数値に基づく)を決定したり、特定の範囲の文字を生成したりする場合などです。

具体的な使用例としては、前述したように連続したコードポイントの文字列を生成する際や、与えられた文字が特定のUnicodeブロック(例えば、ラテン文字やひらがなやキリル文字など)に属するかどうかを判断する際などにord()関数を使います。

そのため、ord()関数はPythonで文字とコードポイントとの間の変換を行うための基本的なツールと言えます。

“a” の次の文字 “b” を表示する#

chr?
Signature: chr(i, /)
Docstring: Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.
Type:      builtin_function_or_method
ord?
Signature: ord(c, /)
Docstring: Return the Unicode code point for a one-character string.
Type:      builtin_function_or_method
ord('a')
97
chr(97)
'a'

型の異なるオブジェクトは演算できない#

'a'+1
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[72], line 1
----> 1 'a'+1

TypeError: can only concatenate str (not "int") to str

文字・文字列を「足す」と連結される#

'a'+'1'
'a1'

文字を数字に変換して「足す」、その結果を文字に戻す#

ord('a')+1
98
chr(_)
'b'
chr(ord('a')+1)
'b'
for i in range(26):
    print(i, ord('a')+i, chr(ord('a')+i))
0 97 a
1 98 b
2 99 c
3 100 d
4 101 e
5 102 f
6 103 g
7 104 h
8 105 i
9 106 j
10 107 k
11 108 l
12 109 m
13 110 n
14 111 o
15 112 p
16 113 q
17 114 r
18 115 s
19 116 t
20 117 u
21 118 v
22 119 w
23 120 x
24 121 y
25 122 z