【Python】郵便番号から地理情報(住所、緯度・経度、最寄り駅)を取得する方法
郵便番号から都道府県、緯度・経度などの地理情報を取得する方法を調べてみました。
調べた範囲では、緯度・経度の情報が欲しい場合の取得方法としては『HeartRails Geo API』が適しています。そこで、本記事では『HeartRails Geo API』の使用方法を記載します。 また、郵便番号が同じでも都道府県・市区町村・町域が異なる場合があるので、ご注意を下さい。
地理情報の取得方法
地理情報の取得方法比較
地理情報の取得方法を比較すると、次のようにまとめられます。
『zip cloud』は、郵便番号データを検索する機能をRESTで提供しているものです。 そのため、『郵便番号DB』と『zip cloud』のデータは実質同じものです。
もともと郵便番号から地図上にその場所をプロットしたかったため、緯度・経度を取得できる『HeartRails Geo API』を採用しました。 次の章でその詳細を記載します。
項目 | HeartRails Geo API | 郵便番号DB | zip cloud |
---|---|---|---|
都道府県コード | X | O | O |
都道府県名(読み含む) | △(読みなし) | O | O |
市区町村名(読み含む) | O | O | O |
町域名(読み含む) | O | O | O |
緯度・経度 | O | X | X |
最寄駅情報 | O | X | X |
参考URL:郵便番号DB・zip cloud の説明
www.post.japanpost.jp zipcloud.ibsnet.co.jp
参考URL:郵便番号DB・zip cloud の利用方法
https://miga-dev.hatenablog.com/entry/python_apimiga-dev.hatenablog.com news.mynavi.jp
HeartRails Geo API
HeartRails Geo APIとは?
『HeartRails Geo API』のサイトで次のように説明されています。 使用方法もとてもシンプルで便利なので、ぜひ活用してみて下さい。
「HeartRails Geo API」 は、郵便番号/住所/緯度経度データ等の地理情報を、XML、JSON(P) 形式の API により無料でご提供させていただくサービスです。この API をご利用になることにより、お客様側ではサーバーサイドの処理を実装することなく、サンプルのようなアプリケーションを簡単に開発することができます。 (ジオコーディング、逆ジオコーディングにも対応しております。)
HeartRails Geo APIの使用方法
調べたい郵便番号の地理情報と最寄駅情報を取得する方法を記載します。
まず、地理情報の取得方法です。
import requests, json postal = '1000001' #調べたい郵便番号 url = 'http://geoapi.heartrails.com/api/json?method=searchByPostal&postal=' res_dict = requests.get(url+postal).json()['response']['location'][0] #地理情報 print(res_dict['prefecture']) #東京都 print(res_dict['city']) #千代田区 print(res_dict['town']) #千代田 print(res_dict['x'],res_dict['y']) #139.753336 35.684473
次に、最寄駅情報の取得方法です。 郵便番号から最寄駅情報を取得できるのは、斬新で面白いですよね。 ただ、残念ながら現状最寄駅情報を使う機会がないので、何かしら活用してみたいです笑
import requests, json postal = '1000001' #調べたい郵便番号 url = 'http://geoapi.heartrails.com/api/json?method=getStations&postal=' res_dict = requests.get(url+postal).json()['response']['station'][0] #最寄駅情報 print(res_dict['name']) #竹橋 print(res_dict['prefecture']) #東京都 print(res_dict['line']) #東京メトロ東西線 print(res_dict['prev'],res_dict['next']) #九段下 大手町 print(res_dict['x'],res_dict['y']) #139.756817 35.690662
郵便番号の使用上の注意
郵便番号と都道府県名・市区町村名・町域名が一対一対応しているわけでは無いようです。 つまり、同じ郵便番号であっても都道府県名・市区町村名・町域名が異なる場合があります。 そのため、事前に重複がある郵便番号を調べてから、『HeartRails Geo API』を利用するのが良いと思います。
2020年2月28日更新データの重複郵便番号の調査
上記の『郵便番号DB』を基に地理情報が重複する郵便番号を調べてみました。 2020年2月28日更新データを調査したため、時期によって異なる場合があるのでご注意下さい。
# | 同じ郵便番号に対して | 件数 |
---|---|---|
1 | 都道府県が異なる | 3 |
2 | #1+市区町村が異なる | 136 |
3 | #2+町域が異なる | 1,533 |
4 | 重複なし | 1187,46 |
5 | 合計 | 120,279 |
郵便番号が同じなのに都道府県が異なるデータ
上表の#1の郵便番号が同じなのに都道府県が異なるデータを記載します。 件数自体は少ないですが、郵便番号と都道府県が一致していないのは意外でした。
郵便番号 | 都道府県 |
---|---|
4980000 | 愛知県 |
4980000 | 三重県 |
6180000 | 京都府 |
6180000 | 大阪府 |
8710000 | 福岡県 |
8710000 | 大分県 |
まとめ
郵便番号から地理情報を取得する方法としては、緯度経度も調べられる『HeartRails Geo API』が適しています。 また、郵便番号が同じでも都道府県・市区町村・町域が異なる場合がありますので、ご注意下さい。
【ゲーム感想】BIOHAZARD RE:3 体験版
2020年4月3日(金)発売予定の『BIOHAZARD RE:3』の体験版が公開されました。
追跡者ネメシスが登場したり、チャーリー君人形などのやり込み要素が存在し、大変満足な内容でした。今から発売が楽しみです。
全体の感想
元作のバイオハザード3はやっていませんが、映像等を比較するとかなり向上しています。 またRE:2同様、操作性も良く、ストレスなくプレイできました。
今回の登場するネメシスは、RE:2のタイラント同様、どこまでも追いかけてきます。RE:2のタイラントの場合、どこにいるのか足音で把握できましたが、ネメシスは建物をつたって突然登場するため、逃げるのが困難でした。しかし、突然登場する場所は、ドーナツ屋前広場、ドーナツ屋の西側の扉前などある程度決まっているので、対策は立てられそうです。
画像のように、影で恐怖を煽る憎い演出が各所に散りばめられており、1周目は本当に怖かったです。 ただ、ゾンビの配置などを覚えれば、恐怖も薄れ効率的に進むことができます。 自分のようにホラー系が苦手な人ほど、周回がオススメです。
チャーリー君人形(やり込み要素)
やり込み要素としてチャーリー君人形が合計20体存在します。 下記URLを参考に壊すことができましたが、とても難しいです。(死にすぎですね汗)
下記リンクを参考に、チャーリー君人形を簡単にまとめました。 #番号の順に破壊すると、効率が良いと思います。ただ#5、#16、#19は自力では難しく、調べなければ無理でした。
【ゲーム感想】DEATH STRANDING
『DEATH STRANDING』のストーリーがクリアできたので、感想を書きます。ゲーム内で収集できるドキュメント等をあまり読んでいないため、あくまでストーリーや操作性などに関する感想です。
この作品の感想を一言で言うと、かなり人を選ぶ作品です。
DEATH STRANDINGとは
概要
『DEATH STRANDING』は、メタルギアシリーズで有名な小島監督が、コナミ退社後に立ち上げたコジマプロダクションの初めての作品です。
ストーリー
「デス・ストランディング」は世界を変えた。人類は分断され、孤立した。サム・ポーター・ブリッジズは、未来への希望を手に、世界を繋ぐために歩き始める。(公式HPより引用)
受賞歴
The Game Awards 2019で、以下の3部門を受賞したそうです。
- the game award for best performance(Mads Mikkelsen)
- the game award for best score/soundtrack
- the game award for best studio/game direction
ゲームの感想
本作は、独特な世界観であり、重厚なストーリーである一方、操作や作業に癖があるように思います。ゲームの感想を良い点と悪い点に分けて書きます。
良かった点
独特な世界観
『時雨(タイム・フォール)』と呼ばれる、触れたモノの時間を経過させる雨が降り、その雨と共に現れるBTという謎の怪物により、分断されたアメリカが舞台となっています。
どこからこの発想が生まれたのか、凡人の自分から一生出てこない設定です(笑)要因は違うものの、人間関係の希薄さという意味では、現代の通づるところがあるように思える。
重厚なストーリー
本作の主人公サム・ポーター・ブリッジズは、「伝説の配達人」として知られる人物で、アメリカを再び一つにするため、各地を巡りカイラル通信を繋ぐことを大統領から依頼されます。そして、サムは時雨と共に現れる怪物BTを認識できるBB(ブリッジ・ベイビー)と共に冒険を始めます。その道中、BT、アメリカ統一を阻むテロリストの脅威を退けつつ、デス・ストランディングとは何か、BBの記憶に登場する人物とは、などの謎を解明するストーリーです。
当初は謎ばかりですが、物語進むことで謎が解明され、まるで映画を見ているようでした。その中でも、主人公サム自身の謎には大変感動しました。
他のプレイヤーからのいいね!
本作はオープンワールドであり、道中は山や川などかなり過酷で、梯子や橋などが必要となります。本来、自分自身で道具を用意する必要がありますが、インターネットに接続することで、他のプレイヤーが建設した橋などを利用することができます。
個人的には、本作で一番の良い演出だと思います。本作のテーマである「繋がり」をオンライン上の他のプレイヤーと意識することができ、かなり粋な演出となっています。そして、他のプレイヤーが自分の建物を利用時にもらえる「いいね!」がやりがいになります。
悪かった点
作業が単調
主人公は配達人であるため、A地点からB地点へ荷物を届けるなどの作業がメインとなっています。そのため、作業が単調になりがちです。加えて、ユーザーのゲームスキルで解決できるものではなく、ひたすら時間を必要とするものなので、かなりシンドイです。
昨今、スマホゲが普及し、据え置き型のゲームも短時間でクリアできる作品(ポケモンのレベル上げなど)が増えています。そんな中、据え置き型の独自性を追求したのだと思いますが、オープンワールドである以上、作業が単調だと辛さの方が勝ります。
道のりが過酷
前述の通り、配達の道のりは山岳地帯(雪山もある)が多く、かなり過酷なものとなっています。そのため、時間の短縮ができるバイクや車が使えない場面が多いです。加えて、道中、謎の怪物BTや配達依存症のミュールの妨害があります。これらに対する効率的な対処方法はなく、時間がかかる要因となっているため、かなりストレスでした。
道中の過酷さにより、主人公の苦労などを追体験することができるため、映画では表現できないゲーム独自の表現だと思いますが、シンドかったです。
【雑談】2020年!あけましておめでとうございます!
2020年になりましたね。あけましておめでとうございます。今年もよろしくお願いします。
本記事では、 2019年の振り返りと2020年の目標を簡易的に書きます。
2019年の振り返り
カレンダー
月ごとの大雑把な予定を書くと、以下の通りです。(手帳等で予定を管理していないので、覚えている範囲で)
3月までは大学院生、4月以降は社会人一年目として過ごした一年でした。 環境が大きく変わったため、苦労することも多く非常に濃密な一年でした。
その一方で、2019年のブログ記事数は7と、非常に残念な感じです。昔から三日坊主は治らないです笑
カレンダー | 代表的な予定 | ブログ関連 |
---|---|---|
1月 | 修論締め切り | ー |
2月 | 修論発表 | 本ブログを開始する(2記事) |
3月 | 卒業 | ー |
4~7月 | 入社・研修 | ー |
8~12月 | 配属 | 10月に3記事、11月に2記事 |
反省
社会人となり自分に不足していると感じることが、大きく3つありました。 その3つは、『情報伝達力(文章力含む)』、『論文の読書不足』、『金融への興味』です。 それぞれ簡単に掘り下げていきます。
情報伝達力(文章力含む)
社会人となり、一番不足していると感じたスキルです。 会話やメールの中で自分の意図した内容を、正確に伝えられないことが多かったです。 これは早急に解決するべき課題ですね。
論文の読書不足
職業柄、論文を読む機会は多いのですが、業務との両立ができず、量をこなすことができませんでした。 英語力がないこともあり、論文を読むのに時間がかかり、非常に苦労しました。
金融への興味
この『金融への興味』とは、私の所属する金融業界にあまり興味が持てない、ということです。 上記の『情報伝達力(文章力含む)』『論文の読書不足』の2つは改善する気がありますが、『金融への興味』に関しては、正直諦めています。不足しているという認識はありますが、転職すれば十分解決する、と思っています。
2020年の目標
2019年の振り返りを踏まえて、目標を3つ立てたいと思います。 その3つは、『国語力の向上』、『論文ノック』、『転職活動』です。 それぞれ簡単に掘り下げます。
情報伝達力の向上
具体的には、読書や記事を通して文章を毎日インプットし、その内容を簡易的にまとめていきたいと思います。 まとめ方法は、正直あまり考えていませんが、場合によっては本ブログの記事にしたいと思います。
論文ノック
ノックとあるように、ひたすら論文を読みたいと思います。 他の方のブログを参考に論文の読み方&まとめ方を検討していきます。 読み方&まとめ方が確定次第、ブログでも共有したいと思います。
転職活動
現職業に興味が持てないため、転職しようと考えています。 興味が持てない主な原因は、自分自身の研究内容や勉強してきたことを活かせないことが挙げられます。 そのため、自分自身の研究と関連性の強い、興味の持てそうな業界を探していきたいと思います。 転職活動は、適宜ブログに書きたいと思います。
【エラーメモ】qcut関数のエラーValueError: Bin edges must be unique
プログラムの実装時に遭遇したエラーを『エラーメモ』という形で残します。 簡易的にしかまとめませんが、誰かのお役に立てれば幸いです。
今回は、分位分析を実施する際(ビ二ング処理)に用いられる、pandasのqcut関数の利用時に遭遇したエラーです。
qcut関数とは?
下記サイトが大変参考になります。 いずれ自分でもまとめようと思っておりますので、お待ち下さい。
以下、簡単な使用例です。 数列[1,2,3,4,5]を3つに分割することを考えます。
import pandas as pd data = pd.DataFrame([1,2,3,4,5]) data.columns = ['val'] data['RNK'] = pd.qcut(data['val'], 3, labels=['Q1', 'Q2', 'Q3'])
特に問題なく、data
を3つに分割できました。
index | val | RNK |
---|---|---|
0 | 1 | Q1 |
1 | 2 | Q1 |
2 | 3 | Q2 |
3 | 4 | Q3 |
4 | 5 | Q3 |
参考サイト
エラー『Bin edges must be unique』とは?
どんなエラー?原因は?
数列[1,1,1,1,2]のような重複のある数列を、3つに分割することを考えます。
すると、次のようにBin edges must be unique
のエラーが発生します。
import pandas as pd data = pd.DataFrame([1,1,1,1,2]) data.columns = ['val'] data['RNK'] = pd.qcut(data['val'], 3, labels=['Q1', 'Q2', 'Q3']) #ValueError: Bin edges must be unique: array([1., 1., 1., 2.]). #You can drop duplicate edges by setting the 'duplicates' kwarg
エラーの原因は、図のように重複のある数列部分に、分位点を設定できないこと、だと思われます。
解決策は?
以下のサイト等を参考に簡単な解決策だけ、まとめました。 難しそうな方法もあるみたいなので、時間を見つけて追加します。(いつか)
①:発生順にランクづけする
rank(method='first')
を用いて、ランクづけを行います。
重複がある場合も出現順にランクづけをするので、分割することが可能です。
import pandas as pd data = pd.DataFrame([1,1,1,1,2]) data.columns = ['val'] data['RNK'] = pd.qcut(data['val'].rank(method='first'), 3, labels=['Q1', 'Q2', 'Q3'])
以下のように、重複ある数列も、発生順に分割できます。
index | val | RNK |
---|---|---|
0 | 1 | Q1 |
1 | 1 | Q1 |
2 | 1 | Q2 |
3 | 1 | Q3 |
4 | 2 | Q3 |
②:ノイズを加え、重複を解消する
重複のある数列にノイズを加え、重複を解消します。
今回は、平均0標準偏差1e-3の正規分布から発生したノイズを加えます。
import numpy as np import pandas as pd data = pd.DataFrame([1,1,1,1,2]) eps = 1e-3 data = data + np.random.normal(0, eps, data.shape) data.columns = ['val'] data['RNK'] = pd.qcut(data['val'], 3, labels=['Q1', 'Q2', 'Q3'])
以下のように、重複ある数列も分割できます。
index | val | RNK |
---|---|---|
0 | 0.999253 | Q1 |
1 | 1.001692 | Q3 |
2 | 1.000051 | Q2 |
3 | 0.999363 | Q1 |
4 | 2.000191 | Q3 |
参考サイト
【自然言語処理】Pythonで係り受け解析したい
Pythonで係り受け解析を実行するために、各種設定を行いました。
当初は、有名な『CaboCha』のインストールを試みたのですが、エラーの修正が困難だったため、『KNP』をインストールしました。
CaboChaとKNP
簡易比較
様々なサイトで指摘されていることではありますが、以下のような特徴あるようです。 ただし、モデルの詳細等は確認しておりません。(いつか書くか?)
項目 | CaboCha | KNP |
---|---|---|
精度 | △ | ◯ |
速度 | ◯ | △ |
CaboChaとKNPの精度比較
「私は漫画が好きで、特にワンピースが好きです」を対象に係り受け解析をしました。 KNPでは、係り受けが精度良くできますが、CaboChaでは『ワンピースが好きです』の『好き』には掛かっていません。
CaboChaの場合
cabochaでは、『私』が『漫画が好き』の『好き』には掛かっていますが、『ワンピースが好きです』の『好き』には掛かっていません。
$ cabocha
KNPの場合
KNPでは、『私』が『漫画が好き』と『ワンピースが好きです 』のそれぞれの『好き』に掛かっています。
$ echo "私は漫画が好きで、特にワンピースが好きです" | jumanpp | knp
CaboChaをインストール
手順
下記のURLを参考にすると、以下のような手順だそうです。
① CaboChaのインストール
$ pip install cabocha
$ curl -OL https://github.com/taku910/cabocha/archive/master.zip $ unzip master.zip $ cd cabocha-master $ pip install python/
Pythonバインディングができない
$ pip install python/
を実行時に、以下のようなエラーメッセージが出ました。(下記のサイトより抜粋)
Building wheel for cabocha-python (setup.py) ... error ERROR: Complete output from command /Users/naokitakekawa/anaconda3/bin/python -u -c 'import setuptools, tokenize;__file__='"'"'/private/var/folders/k1/6wd26qnd4p95tz0fjcf3m6g00000gn/T/pip-req-build-x3co7ade/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' bdist_wheel -d /private/var/folders/k1/6wd26qnd4p95tz0fjcf3m6g00000gn/T/pip-wheel-3eu36t43 --python-tag cp36: ERROR: running bdist_wheel running build running build_py creating build creating build/lib.macosx-10.7-x86_64-3.6 copying CaboCha.py -> build/lib.macosx-10.7-x86_64-3.6 running build_ext building '_CaboCha' extension creating build/temp.macosx-10.7-x86_64-3.6 gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/naokitakekawa/anaconda3/include -arch x86_64 -I/Users/naokitakekawa/anaconda3/include -arch x86_64 -I/usr/local/Cellar/cabocha/0.69/include -I/Users/naokitakekawa/anaconda3/include/python3.6m -c CaboCha_wrap.cxx -o build/temp.macosx-10.7-x86_64-3.6/CaboCha_wrap.o warning: include path for stdlibc++ headers not found; pass '-stdlib=libc++' on the command line to use the libc++ standard library instead [-Wstdlibcxx-not-found] CaboCha_wrap.cxx:2981:10: fatal error: 'stdexcept' file not found #include <stdexcept> ^~~~~~~~~~~ 1 warning and 1 error generated. error: command 'gcc' failed with exit status 1 ---------------------------------------- ERROR: Failed building wheel for cabocha-python
解決策
下記のサイトによると、command Line Tools のバージョンを落とすと解決できるそうです。
ただ、大変そうなので、KNPをインストールすることにしました。
KNPをインストール
手順
以下の二つのサイトを参考に、手順をまとめました。
① JUMAN++をインストール
$ brew install jumanpp
$ jumanpp -v
JUMAN++ 1.02
② KNPをインストール
$ brew install knp
では、The 'brew link' step did not complete successfully
となったため、$ brew link --overwrite knp
を追加しました。
$ brew tap uetchy/nlp $ brew install knp $ brew link --overwrite knp
③ JUMANとKNPのPythonバインディングPyKNPをインストール
pip install pyknp
【言語処理100本ノック】課題No.06〜09
業務で自然言語処理(NLP)に取り組む予定なので、自然言語処理の練習として東北大学の乾・鈴木研究室さんの『言語処理100本ノック 2015』に取り組みたいと思います。
今回の記事では、第1章「06.集合〜09.Typoglycemia」に取り組みます。 間違いや改善点等がありましたら、ご指摘下さい。
また、解くために調べたサイトも記載しておきます。 (サイトの内容は、特にまとめておりません。)
06.集合
課題
"paraparaparadise"と"paragraph"に含まれる文字bi-gramの集合を,それぞれ, XとYとして求め,XとYの和集合,積集合,差集合を求めよ.さらに,'se'というbi-gramがXおよびYに含まれるかどうかを調べよ.
解答
get_ngramは、前回の記事の「05.n-gram」を参考にして下さい。 set型の集合演算を利用して、和集合,積集合,差集合を求めました。
#05.n-gram参照 def get_ngram(seq, num): result = [seq[index:index+num] for index in range(len(seq)+1-num)] return result if __name__ == '__main__': #06. 集合 target_X = "paraparaparadise" target_Y = "paragraph" #文字bi-gramの集合 num = 2 X = set(get_ngram(target_X, num)) Y = set(get_ngram(target_Y, num)) #和集合 union_XY = X | Y union_XY = X.union(Y) #{'ad', 'ag', 'ap', 'ar', 'di', 'gr', 'is', 'pa', 'ph', 'ra', 'se'} #差集合 diff_XY = X - Y diff_XY = X.difference(Y) #{'ad', 'di', 'is', 'se'} #積集合 inter_XY = X & Y inter_XY = X.intersection(Y) #{'ap', 'ar', 'pa', 'ra'} #'se'の有無 target_char = 'se' havingChar_X = target_char in X #True havingChar_Y = target_char in Y #False
set型で集合演算
以下のサイトに詳しく書いてあるので、確認して下さい。
07.テンプレートによる文生成
課題
引数x, y, zを受け取り「x時のyはz」という文字列を返す関数を実装せよ.さらに,x=12, y="気温", z=22.4として,実行結果を確認せよ.
解答
文字列の結合を利用して、関数を実装しました。
def generate_tempSentence(x,y,z): result = str(x) + '時の' + str(y) + 'は' + str(z) return result if __name__ == '__main__': #07.テンプレートによる文生成 (x, y, z) = (12, "気温", 22.4) generate_tempSentence(x, y, z) #'12時の気温は22.4'
08.暗号文
課題
与えられた文字列の各文字を,以下の仕様で変換する関数cipherを実装せよ.
- 英小文字ならば(219 - 文字コード)の文字に置換
- その他の文字はそのまま出力
この関数を用い,英語のメッセージを暗号化・復号化せよ.
解答
def cliper(str): result = [chr(219-ord(char)) if char.isalpha() and char.islower() else char for char in str] result = ''.join(result) return result if __name__ == '__main__': #08.暗号文 a = cliper('taaka11111') #'gzzpz11111' b = cliper(a) #'taaka11111'
英数字文字列の判定方法
以下のサイトに詳しく書いてあるので、確認して下さい。
アルファベットの判定 www.thothchildren.com
文字列の英数字判定 qiita.com
文字コード
文字コード、全然知らなかったです…
当然ですが、全角・半角で違う文字コードが付与されています。
文字 | 文字コード | 全角/半角 |
---|---|---|
a | 97 | 半角 |
z | 122 | 半角 |
a | 65345 | 全角 |
z | 65370 | 全角 |
以下のサイトに詳しく書いてあるので、確認して下さい。
09.Typoglycemia
課題
スペースで区切られた単語列に対して,各単語の先頭と末尾の文字は残し,それ以外の文字の順序をランダムに並び替えるプログラムを作成せよ.ただし,長さが4以下の単語は並び替えないこととする.適当な英語の文(例えば"I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind .")を与え,その実行結果を確認せよ.
解答
リストをシャッフルするメソッドは、表にあるように2つあります。
今回は、文字列に対応して、元リストを変化させないrandom.sample
を利用して、解答しました。
メソッド名 | 文字列に対応 | 破壊的/非破壊的 |
---|---|---|
random.shuffle | × | 破壊的 |
random.sample | ◯ | 非破壊的 |
#09. Typoglycemia target = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ." random.seed(1) wordList = target.split(' ') result = ' '.join([word[0] + ''.join(random.sample(word[1:-1], len(word[1:-1]))) + word[-1] if len(word) > 4 else word for word in wordList]) #I cuno'dlt bevilee that I could aalcutly ursnetnadd what I was rianedg : the paomenhnel pwoer of the haumn mind .
リストをシャッフル
以下のサイトに詳しく書いてあるので、確認して下さい。