【Python】変数に値を追加したい(代入ではなく追加)

Rubyだと以下のような構文があります。

test_01 = ''

test_01 << test1

test_01 << test2

test_01 << test3

test_01 << test4

 

このように、既存の変数の中身を入れ替えるのではなく、どんどん「追加」したい場合です。

 

 

Python には変数にどんどん文字列を追加していくメソッドが存在しない?

探してみましたが、Rubyでいう「<<」のような便利なメソッドはなさそうですね。

リストなら「.append」メソッドがありました。

あとは連結「+」です。

 

■Ruby

test_01 << test1

test_01 << test2

 

 

■Python

test_01 = test_01 + test1

test_01 = test_01 + test2

 

個人的には、イメージとしては

  • Ruby の << は「追加」のイメージ
  • Python の + は「連結」のイメージ

です。

 

一応プログラムの結果は想定したものとなります。

 

【 失敗例 】変数に値をどんどん連結していくプログラム例

これは失敗例です。

エラーになります。

(pyenv) [test@SAKURA_VPS scraping]$ cat test.py
# -*- coding: utf-8 -*-

# ファイルをオープンして果物を配列(リスト)に代入する
f = open('test.txt', 'r')

# 改行コードで分割することを明示
fruits_list = f.read().split('\n')
print(fruits_list)

print('リストの要素数')
print(len(fruits_list))

# 配列 fruits_list を3×3の二次元配列に格納する
# 二次元配列の初期化
fruits_list_2dimensions = [[0 for column in range(3)] for row in range(3)]

z = 0
for x in range(3): # 横のライン
    print(x)
    for y in range(3):  # 縦のライン
        print(y)
        fruits_list_2dimensions[x][y] = fruits_list[z]
        z = z + 1

# 連結用の変数
connected_var = ""

# 二次元配列の中身を出力
for x in fruits_list_2dimensions:
    connected_var = connected_var + fruits_list_2dimensions[x][0]
    connected_var = connected_var + fruits_list_2dimensions[x][1]
    connected_var = connected_var + fruits_list_2dimensions[x][2]

print(connected_var)

# ファイルを閉じる
f.close()
(pyenv) [test@SAKURA_VPS scraping]$

 

 

 

【プログラム実行結果】

(pyenv) [test@SAKURA_VPS scraping]$ python test.py
['りんご', 'みかん', 'ぶどう', 'なし', 'いちじく', 'いちご', 'すいか', 'もも', 'メロン', '']
リストの要素数
10
0
0
1
2
1
0
1
2
2
0
1
2
Traceback (most recent call last):
  File "test.py", line 34, in 
    print(fruits_list_2dimensions[x][1])
TypeError: list indices must be integers or slices, not list
(pyenv) [test@SAKURA_VPS scraping]$

 

「TypeError: list indices must be integers or slices, not list」が出力されます。

タイプエラーは、「異なるタイプ」を使っているからです。

しかも「リスト」だからタイプが異なるのでエラーになっていると読めます。

しかし、なぜでしょうか。

 

 

エラーになった原因

エラーになった原因の回答は「stackoverflow」にありました。

 

TypeError: list indices must be integers or slices, not list

https://stackoverflow.com/questions/37329668/typeerror-list-indices-must-be-integers-or-slices-not-list

 

以下のプログラムがあるとします。

# 配列 fruits_list を3×3の二次元配列に格納する
# 二次元配列の初期化
fruits_list_2dimensions = [[0 for column in range(3)] for row in range(3)]

# 連結用の変数
connected_var = ""

# 二次元配列の中身を出力
for x in fruits_list_2dimensions:
    connected_var = connected_var + fruits_list_2dimensions[x][0]
    connected_var = connected_var + fruits_list_2dimensions[x][1]
    connected_var = connected_var + fruits_list_2dimensions[x][2]

 

この時、x の中身はすでに「fruits_list_2dimensions」そのものが入っているということです。

 

更に以下のドキュメントをよく読めと言っています。

 

https://docs.python.org/3.4/tutorial/controlflow.html#for-statements

 

確かにこう見ると非常に初歩的なミスです。

 

 

【 成功例 】変数に値をどんどん連結していくプログラム例

上記ドキュメントを読んでプログラムを改修しました。

これは成功例です。

(pyenv) [test@SAKURA_VPS scraping]$ cat test.py

# -*- coding: utf-8 -*-

# ファイルをオープンして果物を配列(リスト)に代入する
f = open('test.txt', 'r')

# 改行コードで分割することを明示
fruits_list = f.read().split('\n')
print(fruits_list)

print('リストの要素数')
print(len(fruits_list))

# 配列 fruits_list を3×3の二次元配列に格納する
# 二次元配列の初期化
fruits_list_2dimensions = [[0 for column in range(3)] for row in range(3)]

z = 0
for x in range(3): # 横のライン
    print(x)
    for y in range(3):  # 縦のライン
        print(y)
        fruits_list_2dimensions[x][y] = fruits_list[z]
        z = z + 1

# 連結用の変数
connected_var = ""

# 二次元配列の中身を出力
for x in fruits_list_2dimensions:
    connected_var = connected_var + x[0]
    connected_var = connected_var + x[1]
    connected_var = connected_var + x[2]

print(connected_var)

# ファイルを閉じる
f.close()

 

 

 

【プログラム実行結果】

以下、実行結果です。

こうしてみると、連結をした時に「改行」が入らないですね。

(pyenv) [test@SAKURA_VPS scraping]$ python test.py
['りんご', 'みかん', 'ぶどう', 'なし', 'いちじく', 'いちご', 'すいか', 'もも', 'メロン', '']
リストの要素数
10
0
0
1
2
1
0
1
2
2
0
1
2
りんごみかんぶどうなしいちじくいちごすいかももメロン
(pyenv) [test@SAKURA_VPS scraping]$

 

 

「文字列の連結」&「順番の入れ替え」&「改行の挿入」をするプログラム

仮に改行を入れる場合、更に順番も入れ替える場合は以下のようなプログラムになります。

(pyenv) [test@SAKURA_VPS scraping]$ cat test.py
# -*- coding: utf-8 -*-

# ファイルをオープンして果物を配列(リスト)に代入する
f = open('test.txt', 'r')

# 改行コードで分割することを明示
fruits_list = f.read().split('\n')
print(fruits_list)

print('リストの要素数')
print(len(fruits_list))

# 配列 fruits_list を3×3の二次元配列に格納する
# 二次元配列の初期化
fruits_list_2dimensions = [[0 for column in range(3)] for row in range(3)]

z = 0
for x in range(3): # 横のライン
    print(x)
    for y in range(3):  # 縦のライン
        print(y)
        fruits_list_2dimensions[x][y] = fruits_list[z]
        z = z + 1

# 連結用の変数
connected_var = ""

# 二次元配列の中身を出力
for x in fruits_list_2dimensions:
    connected_var = connected_var + x[0]
    connected_var = connected_var + x[2] + '\n' # 順番の入れ替え、改行の挿入
    connected_var = connected_var + x[1] + '\n'

print(connected_var)

# ファイルを閉じる
f.close()
(pyenv) [test@SAKURA_VPS scraping]$

 

 

【実行結果】

(pyenv) [test@SAKURA_VPS scraping]$ python test.py
['りんご', 'みかん', 'ぶどう', 'なし', 'いちじく', 'いちご', 'すいか', 'もも', 'メロン', '']
リストの要素数
10
0
0
1
2
1
0
1
2
2
0
1
2
りんごぶどう
みかん
なしいちご
いちじく
すいかメロン
もも

(pyenv) [test@SAKURA_VPS scraping]$

 

想定通りの動きになりました。

 

 

 

Posted by 100%レンタルサーバーを使いこなすサイト管理人