renumnum
IPアドレスのv4形式 (例えば 128.0.0.1)や、セマンティック・バージョニング (例えば 1.0.0)といったピリオド区切りの数字(ベクターのようなもの)が便利なことは知られているでしょう。
このピリオド区切りの数字を ASCIIコード順で番号が並ぶ ように OAA128o0o0o1o0 や O1o0o0o0 といった文字列に符号化、またその逆の復号化を行うライブラリーが renumnum (Renumberingist Number)です
Python スクリプトの書き方
👇 説明に入る前に、まず、使ってみましょう
import renumnum as rn
# リナンバリンギスト番号(renumnum)の変数名は何でも構いませんがとりあえず oo としてみましょう
print("整数:1")
oo = rn.num(1)
print(str(oo)) # O1o0
print(oo.totuple()) # (1,)
print(oo.tolist()) # [1]
print("コンマ区切りの整数:128, 0, 0, 1")
oo = rn.num(128, 0, 0, 1)
print(str(oo)) # OAA128o0o0o1o0
print(oo.totuple()) # (128, 0, 0, 1)
print(oo.tolist()) # [128, 0, 0, 1]
print("コンマ区切りの整数:1, 0, 0")
oo = rn.num(1, 0, 0)
print(str(oo)) # O1o0o0o0
print(oo.totuple()) # (1, 0, 0)
print(oo.tolist()) # [1, 0, 0]
print("タプル:(1, 2)")
oo = rn.num((1, 2))
print(str(oo)) # O1o2o0
print(oo.totuple()) # (1, 2)
print(oo.tolist()) # [1, 2]
print("リスト:[1, 2]")
oo = rn.num([1, 2])
print(str(oo)) # O1o2o0
print(oo.totuple()) # (1, 2)
print(oo.tolist()) # [1, 2]
print("文字列:'1'")
oo = rn.num('1')
print(str(oo)) # O1o0
print(oo.totuple()) # (1,)
print(oo.tolist()) # [1]
#oo = rn.num('1, 2') # error
# 末尾に o0 が付いていなくても、辞書順番号として有効です
print("辞書順番号(Dictionary order number):'_9'")
oo = rn.num('_9')
print(str(oo)) # O_9o0
print(oo.totuple()) # (-1,)
print(oo.tolist()) # [-1]
print("同:'A10'")
oo = rn.num('A10')
print(str(oo)) # OA10o0
print(oo.totuple()) # (10,)
print(oo.tolist()) # [10]
# 末尾に o0 が付いていなくても、数珠玉記数法として有効です
print("数珠玉記数法(Beads notation):'O0'")
oo = rn.num('O0')
print(str(oo)) # O0o0
print(oo.totuple()) # (0,)
print(oo.tolist()) # [0]
print("同:'O1'")
oo = rn.num('O1')
print(str(oo)) # O1o0
print(oo.totuple()) # (1,)
print(oo.tolist()) # [1]
# リナンバリンギスト番号
print("リナンバリンギスト番号(Renumberingist number):'O0o0'")
oo = rn.num('O0o0')
print(str(oo)) # O0o0
print(oo.totuple()) # (0,)
print(oo.tolist()) # [0]
print("同:'O1o0'")
oo = rn.num('O1o0')
print(str(oo)) # O1o0
print(oo.totuple()) # (1,)
print(oo.tolist()) # [1]
# 比較
print("O1o0 < O2o0")
oo1 = rn.num('O1o0')
oo2 = rn.num('O2o0')
print(oo1 < oo2) # True
print("O1o0 < O1o0o0")
oo1 = rn.num('O1o0')
oo2 = rn.num('O1o0o0')
print(oo1 < oo2) # True
👆 O1o0 や、 O1o2o0 といった文字列を作るのが renumnum ライブラリーだということが分かります。
(renumnum==0.2.2 から) 比較演算子にも対応しました
O1o0 や、 O1o2o0 といった文字列の用途
次に、コンピューターを利用している場面で、スカラー数(ピリオドで区切っていない私たちがよく知っている 1 とか 2 といった数)を使っているときにリナンバリングすると起こりやすい問題を説明します。
最後に、O1o0 や、 O1o2o0 といった文字列(名前はリナンバリンギスト番号、renumnumとでもしましょう)を説明します。
例:私たちのよく知っている数字を使った出席番号
1 アリス
2 チャーリー
3 デーブ
4 エミリー
👆 この出席番号の1番目と2番目の間にボブを加えたいとき
1 アリス --> 1 アリス
--> 2 ボブ
2 チャーリー --> 3 チャーリー
3 デーブ --> 4 デーブ
4 エミリー --> 5 エミリー
👆 もともと2番以降の人たちをリナンバリング(=番号を昇順に振り直すこと)する手間が発生します
リナンバリングしても、番号を振り直す手間が発生しないような便利な数字があったらいいな、というような過激な思想をもった人たちをリナンバリンギスト(Renumberingist)とでも呼ぶとしましょう。
そんなリナンバリンギストのための数字がリナンバリンギスト番号(Renumberingist Number)、renumnumです
例:リナンバリンギスト番号を使った出席番号
リナンバリンギスト番号を説明する前に、まずは使ってみましょう
👇 以下が、リナンバリンギスト番号を使った出席番号です
o1o0 アリス
o2o0 チャーリー
o3o0 デーブ
o4o0 エミリー
👆 この出席番号の1番目と2番目の間にボブを加えたいとき
o1o0 アリス --> o1o0 アリス
--> o1o5o0 ボブ
o2o0 チャーリー --> o2o0 チャーリー
o3o0 デーブ --> o3o0 デーブ
o4o0 エミリー --> o4o0 エミリー
👆 "1.5" の感覚で、既存の人の出席番号を変えず、ボブだけを順番の中に組み込めました
👇 では次に、アリス(Alice)とボブ(Bob)の間にアン(Ann)が6人転入してきたケースも考えてみましょう
o1o0 アリス --> o1o0 アリス
--> o1o_9o0 アン
--> o1o0o0 アン
--> o1o1o0 アン
--> o1o2o0 アン
--> o1o3o0 アン
--> o1o4o0 アン
o1o5o0 ボブ --> o1o5o0 ボブ
o2o0 チャーリー --> o2o0 チャーリー
o3o0 デーブ --> o3o0 デーブ
o4o0 エミリー --> o4o0 エミリー
👆 いくつかの挿入方法がありますが、アンを6人追加できました。 _9 というのは、私たちがよく知っている数では -1 であることに注意してください。
覚え方としては、 0 から 1 を引くと 9 になって1桁下がる、という感じです。
-9 なら _1、 -10 なら __9 になります
また、 o1o0 アリス と o1o0o0 アン の出席番号をご覧ください。末尾に o0 が常に付くというルールがあることにより、0番を後から追加したいが既存の 0番 と被ってしまう、という問題が回避されています
👇 では、2人目のアンと3人目のアンの間に、またアンを挟んでみましょう
o1o0 アリス --> o1o0 アリス
o1o_9o0 アン --> o1o_9o0 アン
o1o0o0 アン --> o1o0o0 アン
--> o1o0o5o0 アン
o1o1o0 アン --> o1o1o0 アン
o1o2o0 アン --> o1o2o0 アン
o1o3o0 アン --> o1o3o0 アン
o1o4o0 アン --> o1o4o0 アン
o1o5o0 ボブ --> o1o5o0 ボブ
o2o0 チャーリー --> o2o0 チャーリー
o3o0 デーブ --> o3o0 デーブ
o4o0 エミリー --> o4o0 エミリー
👆 問題なく挟めました。私たちがよく知っている数字でいうと "1.0.5" といったような感覚です
👇 出席番号が2桁になったときは、以下のような手間が発生するので注意してください
o1o0
o2o0
o3o0
oa10o0
👆 数字が1桁増えるたびに頭に a が付きます。 100 なら oaa100o0 です。そう、桁数の多い数字は私たちが使い慣れている数字よりおよそ2倍の文字数になります。これは辞書順を従えさせるためのコストです
o1o0
O1o0
O1O0
👆 lowercase、PascalCase、UPPERCASE のいずれでも構いません
MAX_NUMBER_O1O0 = 99
class HelloWorldO1o0():
def print_o1o0(self):
pass
👆 リナンバリンギスト番号は、プログラム中でもなるべく記入できることを念頭に置いています
解説
じゃあ出席番号に 1.0.5 や 1.5 を使えるようにすればいいだけではないのか? と思われるかもしれません
1 アリス
1.0.5 アン
1.5 ボブ
2 チャーリー
👆 最近はソフトウェアも賢くなって、Visual Studio Code のエクスプローラーなどでは数字順に並んでくれます
1.0.5 アン
1.5 ボブ
1 アリス
2 チャーリー
👆 そうでないケースでは、ASCII コード順に並んでしまうことがあります
o1o0 アリス
o1o0o5o0 アン
o1o5o0 ボブ
o2o0 チャーリー
👆 リナンバリンギスト番号は、賢くなく ASCII コード順に並ぶソフトウェアでも順番通りに並んでくれます
同様に、次の問題もリナンバリンギスト番号は解決してくれます
10
1
2
3
👆 賢くないソフトウェアでは、 1 より前に 10 が並ぶケースはあるでしょう
o1o0
o2o0
o3o0
oa10o0
👆 リナンバリンギスト番号は、賢くなく ASCII コード順に並ぶソフトウェアでも順番通りに並んでくれます
負数では _9 のようにアンダースコアを使いますが、コーディング規約などでアンダースコアを使ってはいけないケースもあるかもしれません。その際は、並び順が崩れてしまいますがアンダースコアの代わりに前ゼロを使って 09 で我慢しましょう
Metadata
Release files for renumnum 0.2.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| renumnum-0.2.2.tar.gz | 11.2 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| renumnum-0.2.2-py2.py3-none-any.whl | Python 3, Python 2 | none | any | Details |
Total release size: 22.3 kB
Release files / renumnum-0.2.2.tar.gz
| Download URL | renumnum-0.2.2.tar.gz |
|---|---|
| Size | 11.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a936b293dd94b34c93a5ab66a4709769064a1aa97176f9b574c94ee2c60eeaf8
|
|
BLAKE2b-256 checksum How to use checksums |
fbf004ffd028ba5bcc4df56674b092436a380892256fdcc335663a1fe4383221
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/5.1.1 CPython/3.12.3
|
Release files / renumnum-0.2.2-py2.py3-none-any.whl
| Download URL | renumnum-0.2.2-py2.py3-none-any.whl |
|---|---|
| Size | 11.2 kB |
| Tags | Python 2 Python 3 |
|
SHA-256 checksum How to use checksums |
266cd99ea39b285c17e08e7afa4692fd696453864b8fd6a6915a422fa355b023
|
|
BLAKE2b-256 checksum How to use checksums |
cbdb0d868ffc5bc48417759bd3979f5341b9fcf3e0c93630f9c784e380f7f386
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/5.1.1 CPython/3.12.3
|
Security for renumnum 0.2.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.