☆☆ 新着記事 ☆☆

2019年1月28日月曜日

TypeError: 'str' object does not support item assignment

リストを操作していると、上記のようなエラーになることがあります。 これは、リストのように見える値が、実はストリング(文字列)だった場合に発生するエラーのようです。
自分の場合は、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 件のコメント:

コメントを投稿