よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

【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
'パタトクカシーー'



以上です。