Pythonにできることは自動化しよう!【第1回 リスト】

こんにちは、unogram管理人のうのちゅ〜です。

今回から、【Pythonにできることは自動化しよう!】シリーズとして、Pythonの基礎から順を追って解説し、作業の自動化・効率化を実現する能力を身に着けていきます。Pythonの基礎について学ぶだけで、大規模なコードを書かなくても十分に役に立つプログラムを記述することができるようになります。Pythonは気になるけど、プログラミングには苦手意識がある方も安心してトライしてみてください!

本シリーズでは、以下のようなことができるようになります。

  • ファイルの読み書き・管理
  • Webサイトからファイルをダウンロード
  • エクセルシート操作
  • PDF・ワード文書操作・テキスト抽出
  • 電子メール・SMS送信

うまく活用すれば作業に役立ちそうなワードがたくさん並んでいますね!

なお、本シリーズでは一部以下の書籍を参考にしています。「退屈なことをPythonにやらせる」ようになるためにはうってつけの書籍なので、ぜひ参考にしてみてください。

それでは見ていきましょう!



Pythonにできることは自動化しよう!【第1回 リスト】

今回はシリーズ第1回として、Pythonの重要なデータ型であるリストの基礎について学習します。

リストを使用するメリットは、データが構造的に保持されることで、似たようなたくさんの変数を使うことなく柔軟なデータ処理を行えるようになることです。

リストをうまく使いこなせるようになって、Pythonにできることを自動化する第一歩を踏み出しましょう!

本シリーズではPython環境の導入に関しては扱いません(世の中の多くの人が解説しているので…)が、Pythonを始めるために必要なパッケージはAnacondaをインストールするのがおすすめです。Python Japanの公式サイトからインストールできます。

リスト型の基礎

「リスト」は「複数の値を順番に並べた値」です。角括弧[]で囲んで記述します。

リストの中の値は「要素」と呼びます。これらは角括弧[]の中にカンマ区切りで記述します。

「リスト値」はリストそのもののことを指します(リスト内の要素のことではありません)。

リストの生成

リストには数値や文字列などさまざまなデータ型の要素を含むことができ、数字と文字列など異なるデータ型の要素を1つのリストに含めることも可能です。

[1,2,3,4]
['apple', 'orange','grape']
[1,'apple',True]

次の例のうち、wordlistという変数はリスト値が入っています。また、noelementlistという変数は値がひとつも入っていないリストになっており、空リストと呼ばれます。

wordlist = ['apple', 'orange','grape']
noelementlist=[]

インデックス指定による要素の変更

リスト中の要素には、インデックス指定して新しい値を代入できます。

wordlist[2]='lemon'
wordlist
# ['apple', 'orange', 'lemon']

リストの連結

文字列と同様に、リストどうしを’+’記号によって連結して新しいリスト値を生成することができます。

また、’*’記号を使用すると、リストを複製して連結した新しいリストを生成します。

例を見てみましょう。

wordlist2 = ['strawberry','cherry']
wordlist + wordlist2
# ['apple', 'orange', 'lemon', 'strawberry', 'cherry']

wordlist * 2
# ['apple', 'orange', 'lemon', 'apple', 'orange', 'lemon']

del文によるリスト中の値の削除

‘del リスト名[インデックス]’とすると、該当するリスト中の値が削除され、それより後ろのインデックスの値が前にずれます。次の例では、インデックス1だった’orange’が削除されています。

del wordlist[1]
wordlist
# ['apple', 'lemon']

forループにリストを使用する

forループで繰り返す要素に、リスト中の値を使用することができます。次の例では、リスト中の値をforループのループごとにプリントするものです。

for i in [0,10,100]:
    print(i)
# 0
# 10
# 100

文字列を要素にもつリストも同様に使用できます。

for s in wordlist:
    print(s)
# apple
# lemon



値がリストの中に含まれるかを判定する演算子 in, not in

‘判定したい値 in 対象のリスト’、あるいは、’判定したい値 not in 対象のリスト’とすることで、判定したい値がリストの中に存在するか(しないか)をブール値(True/False)で返すことができます。

'apple' in wordlist
# True

'banana' in wordlist
# False

'banana' not in wordlist # 「バナナはwordlistに含まれない」はTrue
# True

リストを用いて複数の変数に1行で代入する

リストの便利な使い方の1つに、複数の変数に1行で代入するというものがあります。例を見てみましょう。

redfruit, yellowfruit = wordlist

print(redfruit)
# apple

print(yellowfruit)
# lemon

リスト型でよく使われるメソッド

リスト型の変数によく使われるメソッド(あるデータ型の値専用の関数)として、index(), append(), insert(), remove(), sort()を取り上げます。

リストから値を検索するindex()メソッド

’リスト名.index(検索したい値)’とすると、検索したい値のインデックスを返してくれるメソッドです。リスト中にその値がないとエラーとなります。

wordlist.index('apple')
# 0

wordlist.index('banana')
# ValueError: 'banana' is not in list

リストに値を追加するappend()メソッド、insert()メソッド

‘リスト名.append(追加したい値)’とすると、リストの末尾に’追加したい値’が追加されます。

一方、’リスト名.insert(挿入したいインデックス,追加したい値)’とすると、挿入したいインデックスの位置に追加したい値が追加されます。

これらのメソッドで注意すべきは、リストがその場で書き換わるということです。append()メソッドやinsert()メソッドの戻り値はNoneとなります。

wordlist.append('pineapple')
wordlist
# ['apple', 'lemon', 'pineapple']

wordlist.insert(1,'peach')
wordlist
# ['apple', 'peach', 'lemon', 'pineapple']

リストから値を削除するremove()メソッド

del文のように、’リスト名.remove(削除したい値)’とすることで、リスト中の最初に存在する削除したい値を削除します。

wordlist.remove('lemon')
wordlist
# ['apple', 'peach', 'pineapple']

リスト中の値をソートするsort()メソッド

‘リスト名.sort()’とすることで、リスト中の値をソートできます。デフォルトではASCIIコード順にソートします。append()メソッド等と同様にリストはその場で書き換わる点に注意です。

wordlist.sort()
wordlist
# ['apple', 'peach', 'pineapple']



リストと文字列、タプル

リストと文字列、タプルの相違点や変換について紹介します。

リストはミュータブル、文字列・タプルはイミュータブル

多くの点で共通する、リストと文字列、タプルの各データ型ですが、もちろん相違点もあります。大きな違いは、リストはミュータブル(変更可能)である一方、文字列やタプルはイミュータブル(変更不可)である点です。つまり、文字列やタプルには値の追加や変更、削除ができません。

favoritefruit = 'I like an apple.'
favoritefruit[0] = 'You'
# TypeError: 'str' object does not support item assignment

basket=('apple',2)
basket[1] = 3
# TypeError: 'tuple' object does not support item assignment

型変換するlist()関数とtuple()関数

タプルの値で、変更可能なものが必要な場合など、リストとタプルを相互に変換したい場合があります。そのようなときは、list()関数やtuple()関数を使って型を変換します。

list(basket)
# ['apple', 2]

tuple(wordlist)
# ('apple', 'peach', 'pineapple')

リスト型の注意点 copy(), deepcopy()

リストのコピー・参照には注意が必要です。リストを変数に代入すると、内部的にはリストの参照が変数に代入されることになります。例を見てみましょう。

newwordlist = wordlist
newwordlist
# ['apple', 'peach', 'pineapple']

newwordlist[2] = 'melon'
wordlist
# ['apple', 'peach', 'melon']

この例では、コピーによって新しく生成したリストnewwordlistのインデックス2の要素を変更しただけなのに、元のリストwordlistの要素まで変更されています。これが、「リストの参照が変数に代入された」結果です。つまり、wordlistとnewwordlistの各要素が参照しているものは同じため、一方が変更されるともう一方のリストの中身にも影響することになるのです。

この仕組みを理解していないと、プログラムが予期せぬ動作を起こす可能性があるので注意しましょう。

元のリストが変更されないようにリストをコピーしたい場合は、copyモジュールをインポートし、copy.copy()関数を使用します。リストを含むリストをコピーする場合はcopy.deepcopy()関数を使用します。

import copy
wordlist = ['apple', 'peach', 'pineapple']
newwordlist2 = copy.copy(wordlist)
newwordlist2[2] = 'melon'
print(wordlist)
print(newwordlist2)



まとめ

今回から、【Pythonにできることは自動化しよう!】シリーズとして、Pythonを使った作業の自動化・効率化を実現する第一歩を踏み出しました。

今回は第1回として、Pythonの基礎中の基礎であるリストの扱いについて学習しました。リストは今後の自動化に向けた取り組みにおいても頻繁に登場するので、しっかり使いこなせるようにしておきましょう!

追加で詳しく学びたいという方は、下記の参考書などを使った学習にも挑戦してみてください。

おすすめ参考書

冒頭でも紹介しましたが、Pythonによる自動化に向けた学習は、本シリーズでも参考にしている次の書籍がおすすめです。「退屈なことをPythonにやらせる」ようになるためにはうってつけの書籍なので、ぜひ参考にしてみてください。