リストを操作していると、上記のようなエラーになることがあります。 これは、リストのように見える値が、実はストリング(文字列)だった場合に発生するエラーのようです。
自分の場合は、csvファイルからデータを読み込んだ時に、2元リストのデータを読み込んだ時に、このエラーが発生しました。
以下、対処方法です。
(問題の確認)
◆リストの要素へのアクセス
a=["1","2","3","4"]
print(a[0]) #1
print(a[1]) #2
◆リストがストリング形式だと。
a = str(["1","2","3","4"])
print(a[0]) #[
print(a[1]) # '
*ひとつひとつのキャラクターが認識されてしまう。
a_new=a.replace(',',':')
print(a_new) ♯ ['1': '2': '3': '4']
*文字ブロックだから、replaceは出来る。
◆List()関数で再変換してみる。
a = str(["1","2","3","4"])
list(a)
print(a) ♯['1', '2', '3', '4']
print(a[0]) #[
print(a[1]) # '
*変化なし。外見はリストに見えるけど、実質はstringのまま。
◆split / joinしてみる。(動作確認)
(1) Split してみる。
a = str ( ["1","2","3","4"] )
b=a.split(',') ←カンマ区切りでsplit。
print(b) # ["['1'", " '2'", " '3'", " '4']"] <-- 戻り値はリスト形式。
print(b[0]) # ['1'
print(b[1]) # '2'
(2)join
a = str(["1","2","3","4"])
b=a.split(',')
a=(',').join(b) <- カンマ区切り文字として結合。
(変換対象文字列、区切り書式の書き方は、splitとは逆なので注意。)
print(a) # ['1', '2', '3', '4']
print(a[0]) # [
print(a[1]) # '
*最初と同じで、効果なし。
◆' [ ' , ' ] ' や ’(クォート)を地道に削除する。
a = str(["1","2","3","4"])
new_a=a.replace('[','')
new_a=a.replace(']','')
new_a=a.replace('\'','')
print(new_a) # [1, 2, 3, 4]
前処理終了。 ここから、やりたい処理にはいる。
例)shuffleをする。 ただし、まだ変数 'new_a' は、ひと塊のstringsなので
ここで処理しても、以下のエラーとなる。
x[i], x[j] = x[j], x[i]
TypeError: 'str' object does not support item assignment.
なので、以下のように、splitしてから処理する。
====Python3.6の場合
import random
a = str(["1","2","3","4"])
new_a=a.replace('[','')
new_a=a.replace(']','')
new_a=a.replace('\'','')
print(new_a) # 1, 2, 3, 4
b=new_a.split(',')
random.shuffle(b)
new_a=b
print(new_a) # [ ' 2', ' 4',' 3', '1']
*Python3.7は、上記のような挙動はしないようです。
replace の ('[')や(']') が機能しません。
0 件のコメント:
コメントを投稿