【Numpy】言語処理ノック「パタトクカシーー」をNumpyで
100本ノックにある「パタトクカシーー」問題
問)
文字列「パトカー」と「タクシー」を互い違いに交ぜて「パタトクカシーー」を作れ。
これをNumpyでやってみる。
まずは数字でやってみる。
要素数が同じ2つのリストを用意した。
a=[1, 2, 3, 4, 5] b=[6, 7, 8, 9, 10] ↓ c=[1, 6, 2, 7, 3, 8, 4, 9, 5, 10]
Numpyで。
a=[1, 2, 3, 4, 5] b=[6, 7, 8, 9, 10] # インポート import numpy as np # まずはそのままNumpy配列にする。 c= np.array([a,b]) c
array([[ 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10]])
次に転置する
d=c.T d
array([[ 1, 6],
[ 2, 7],
[ 3, 8],
[ 4, 9],
[ 5, 10]])
最後に一次元にして、リストに変換
e=list(d.ravel())
e
[1, 6, 2, 7, 3, 8, 4, 9, 5, 10]
type(e)
list
同じようにして「パトカー」「タクシー」は行けますかね、
a="パトカー" b="タクシー" # 文字列をリストで分解 a=list(a) b=list(b) print(a, b)
['パ', 'ト', 'カ', 'ー'] ['タ', 'ク', 'シ', 'ー']
上で数字でやったのと同じことを無理やり一行で書く。
c="".join(list(np.array([a, b]).T.ravel())) c
'パタトクカシーー'
でけました。
言語処理100本ノックでは、
for
文とzip
を使ってやるようだ。
print(a, b)
['パ', 'ト', 'カ', 'ー'] ['タ', 'ク', 'シ', 'ー']
for i,j in zip(a,b): print([i,j])
['パ', 'タ']
['ト', 'ク']
['カ', 'シ']
['ー', 'ー']
これを一行で書く。内包表記。
c= [([i,j]) for i,j in zip(a,b)] c
[['パ', 'タ'], ['ト', 'ク'], ['カ', 'シ'], ['ー', 'ー']]
リスト内にある3つ4つのリストを"".join(リスト)
でくっつける。
d= ["".join(([i,j])) for i,j in zip(a,b)] d
['パタ', 'トク', 'カシ', 'ーー']
これも同じように"".join(リスト)
でくっつける。
e= "".join(d)
e
'パタトクカシーー'
無理やり一行で書くと、
f = "".join(["".join(([i,j])) for i,j in zip(a,b)]) f
'パタトクカシーー'
以上です。