DBのテーブルにリスト型を格納したかったのだができず
リスト型ではなく文字列型になってしまった、、、
それを無理くり文字列型からリスト型に変換しようとコードを書いた時、
少し時間がかかってしまったので次同じことがならないようメモしておく。
同じような壁にぶつかっている人のためになれたら良い。`python
#流れ
string ='[array([214.47574751, 203.98006645, 191.06578073]), array([249.65382015, 246.24678837, 237.59364435]), array([193.12008427, 178.51825843, 169.64747191]), array([232.57498223, 224.88343994, 212.97867804]), array([173.1154239 , 155.47395301, 145.18692543]), array([121.93815514, 57.82809224, 28.99895178]), array([157.37873357, 72.27598566, 28.41577061]), array([188.40971357, 96.51183064, 41.66998755]), array([154.08440367, 95.2 , 64.09724771]), array([196.89483395, 129.84317343, 81.29520295]), array([89.64661654, 36.62781955, 18.37781955]), array([221.26704545, 166.53125 , 124.64772727])]'
↑リスト化したい文字列
1・一度(,)カンマで区切って文字列からリストに変換
2・区切りすぎたので必要な要素を足し算し修正
3・余分な文字列削除
4・簡易的な文字列のリストもどきができたらそれをリスト型に変換!!!
#一度(,)カンマで区切って文字列からリストに変換
lst = string.split(',')
lst
1・一度(,)カンマで区切って文字列からリストに変換
最初の段階で重要な点としては
理想のリスト化とは異なったとしても一度リスト化すること!!!
,カンマで区切ってリスト化は頻出
出力結果
['[array([214.47574751',
' 203.98006645',
' 191.06578073])',
' array([249.65382015',
' 246.24678837',
' 237.59364435])',
' array([193.12008427',
' 178.51825843',
' 169.64747191])',
' array([232.57498223',
' 224.88343994',
' 212.97867804])',
' array([173.1154239 ',
' 155.47395301',
' 145.18692543])',
' array([121.93815514',
' 57.82809224',
' 28.99895178])',
' array([157.37873357',
' 72.27598566',
' 28.41577061])',
' array([188.40971357',
' 96.51183064',
' 41.66998755])',
' array([154.08440367',
' 95.2 ',
' 64.09724771])',
' array([196.89483395',
' 129.84317343',
' 81.29520295])',
' array([89.64661654',
' 36.62781955',
' 18.37781955])',
' array([221.26704545',
' 166.53125 ',
' 124.64772727])]']
#今回はRGBデータなので3つ区切りを1セットにしていく
string_arrays = []
for i in range(0,len(lst),3):#iは0,3,6,9,,,,
s = (lst[i] +',' + lst[i + 1] + ',' +lst[i + 2])
string_arrays.append(s)
string_arrays
2・区切りすぎたので必要な要素を足し算し修正
1を実行した際に区切る必要なないところで区切ってしまった。
なので修正案として文字列の足し算を利用し、塊を作成していく。
出力結果
['[array([214.47574751, 203.98006645, 191.06578073])',
' array([249.65382015, 246.24678837, 237.59364435])',
' array([193.12008427, 178.51825843, 169.64747191])',
' array([232.57498223, 224.88343994, 212.97867804])',
' array([173.1154239 , 155.47395301, 145.18692543])',
' array([121.93815514, 57.82809224, 28.99895178])',
' array([157.37873357, 72.27598566, 28.41577061])',
' array([188.40971357, 96.51183064, 41.66998755])',
' array([154.08440367, 95.2 , 64.09724771])',
' array([196.89483395, 129.84317343, 81.29520295])',
' array([89.64661654, 36.62781955, 18.37781955])',
' array([221.26704545, 166.53125 , 124.64772727])]']
#' array()などの文字が邪魔なので削除'
import ast
dc = []
for i,s in enumerate(string_arrays):
if i == 0:
s = s.replace('[array(', '')#初回の要素だけ'[array('になっているので例外処理
s = s.replace(')', '')
elif i == len(string_arrays) - 1:
s = s.replace(' array(','')
s = s.replace(')]', '')#最後の要素だけ')]'になっているので例外処理
else:
s = s.replace(' array(','')
s = s.replace(')', '')
print(s,type(s))#この段階ではまだリストではなく文字列型
output = ast.literal_eval(s)#文字列をリストに変換(高度な文字列はリストに変換できないから前処理を実行していた)
dc.append(output)
print()
print(dc)
3・余分な文字列削除
4・簡易的な文字列のリストもどきができたらそれをリスト型に変換!!!
見事複雑な文字列をリスト化完了
出力結果
[249.65382015, 246.24678837, 237.59364435]
[193.12008427, 178.51825843, 169.64747191]
[232.57498223, 224.88343994, 212.97867804]
[173.1154239 , 155.47395301, 145.18692543]
[121.93815514, 57.82809224, 28.99895178]
[157.37873357, 72.27598566, 28.41577061]
[188.40971357, 96.51183064, 41.66998755]
[154.08440367, 95.2 , 64.09724771]
[196.89483395, 129.84317343, 81.29520295]
[89.64661654, 36.62781955, 18.37781955]
[[249.65382015, 246.24678837, 237.59364435], [193.12008427, 178.51825843, 169.64747191], [232.57498223, 224.88343994, 212.97867804], [173.1154239, 155.47395301, 145.18692543], [121.93815514, 57.82809224, 28.99895178], [157.37873357, 72.27598566, 28.41577061], [188.40971357, 96.51183064, 41.66998755], [154.08440367, 95.2, 64.09724771], [196.89483395, 129.84317343, 81.29520295], [89.64661654, 36.62781955, 18.37781955]]
print(type(dc[0]))
試しにデータ型確認
出力結果
問題なし!!!