2023年2月15日水曜日

Python書式:全角文字の幅問題(完成のつもり) [ Python ]

前回のつづき「全角文字も揃えたい」です。
がんばっちゃったよ(笑) 暇ともいうが・・・

 Pythonの書式で%sの幅指定が文字数でカウントされるので、文字幅が全角と半角が混在すると全角分ずつずれてしまう問題の解決策をここに書いておくよ!将来の自分のために・・・

で、完成版です、はいこれ!

文字幅の指定を負数にすると左寄せになるのです!


<追記>ついに、禁断の手に出たぞ俺!


member.py
from unicodedata import east_asian_width from functools import reduce member = [ { "name":"あいうえ", "weight":90, "height":177 }, { "name":"Super 真理雄", "weight":250, "height":188 }, { "name":"Ninja", "weight":70, "height":160 }, { "name":"Mr.エックス", "weight":66, "height":167 }, ] padstr = lambda s,w: reduce(lambda a, c: a[east_asian_width(c) in "FWA" and 2 or 1:]+c, s[::(w < 0) and -1 or 1], " "*abs(w))[::(w < 0) and -1 or 1] print("<< padstr(+) >>") for m in member: print(f'{padstr(m["name"], 15)} : {m["weight"]:5}Kg {m["height"]:5}cm') print("-"*50) print("<< padstr(-) >>") for m in member: print(f'{padstr(m["name"], -15)} : {m["weight"]:5}Kg {m["height"]:5}cm')
はい、めっちゃ長いラムダ式になっちまいました。。。。
もう、普通の関数でいいじゃん。。。

まあ、将来の私よ!
今の私の実力はこの程度なのだよ!!
笑ってくれ(笑)


※ちなみに、ラムダ式を変数に代入することはPEP8の推奨事項を無視することになります(笑)


<追記>
んで、もうちょっと短くしてみた・・・

関数のところだけ抜粋・・・

<追記>
コピペ版用にimportも追加しておく
あ、文字幅は 日本語1文字 を としてネ!

最終版?
from unicodedata import east_asian_width from functools import reduce padstr = lambda s,w: reduce(lambda a,c:a[(east_asian_width(c)in"FWA")+1:]+c,s[::abs(w)//w]," "*abs(w))[::abs(w)//w]
よく出来ました。

でも、超読みづらい!!!

おしまい。。。




0 件のコメント:

コメントを投稿