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]$
|
想定通りの動きになりました。
コメント