LoginSignup
3
6

More than 3 years have passed since last update.

[アルゴリズム×Python] リストの使いかた

Last updated at Posted at 2020-08-09

アルゴリズムとPythonについて書いていきます。

目次
0.アルゴリズムとは
1.リストとは
2.リストの使いかた
 2-0.リストの作成
 2-1.リスト内包表記
 2-2.他のデータ型からリストをつくる
 2-3.要素の取得
 2-4.要素の更新
 2-5.要素の追加
 2-6.要素の削除
 2-7.要素の並べ替え
 2-8.リストのリスト
 2-9.リストの結合
 2-10.その他の操作

0.アルゴリズムとは

計算や作業をするための手順のことです。
短時間効率的に処理をすることを目指します。

1.リストとは

データ構造の1つで、データを一直線に並べた構造をしています。
大量のデータを扱うアルゴリズムではよく使われます。
リストはデータの追加や削除がしやすい反面、アクセスに時間がかかります。

Point : データ構造
データをコンピュータのメモリにいれる時に、データの順番や位置関係などを定めたものです。

1-0.Pythonとリスト

Pythonでは、配列よりもリストを使うことが多いです。
リストの要素は、任意のPythonオブジェクトで良いです。
そして、要素の型は統一しなくて良いです。

Point : 配列
データ構造の1つで、データを一列に並べるものです。
データへのアクセスは簡単に行える反面、追加や削除には手間がかかります。

2.リストの使いかた

2-0.リストの作成

リストの名前 = []という形でリストをつくります。

#要素がない空のリストをつくる
color_list = []

もちろん最初から要素を入れてつくることもできます。
その場合は、下のようにカンマで区切って要素を入れます。

#リストに要素をいれる
color_list = ['Red','Yellow','Green']

2-1.リスト内包表記

◯様々な種類のリストを効率的につくるために、リスト内包表記が使われます。


リスト内包表記とは

◯リストをつくる方法の1つです。
[リストに格納する要素 for 要素 in イテラブルオブジェクト]という形で定義します。
リストに格納する要素は、要素を使用したです。
イテラブルオブジェクトは、要素を1つずつ取り出すことのできるオブジェクトのことです。


リスト内包表記の使用例

◯range()関数はイテラブルオブジェクトを返します。

ex0.py
#1以上10未満の整数を1つずつ取り出して、その値をnumbersリストに格納する
numbers = [number for number in range(1,10)]
print(numbers)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
ex1.py
#1以上10未満の整数を1つずつ取り出して、それに2をかけた値をnumbersリストに格納する
numbers = [number * 2 for number in range(1,10)]
print(numbers)
[2, 4, 6, 8, 10, 12, 14, 16, 18]
ex2.py
#1以上10未満の整数を1つずつ取り出して、偶数の値のみをnumbersリストに格納していく
numbers = [number for number in range(1,10) if number % 2 == 0]
print(numbers)
[2, 4, 6, 8]
ex3.py
#文字列のリスト
list_1 = ['1','2','3']
#文字列のリストlist_1から要素を1つずつ取り出して、整数にしてからリストnumbersに格納する
numbers = [int(i) for i in list_1]
print(numbers)
[1, 2, 3]
ex4.py
#取り出した要素が奇数ならばそのまま格納して偶数ならば2乗してから格納する
numbers = [i if i % 2 == 1 else i**2 for i in range(10)]
print(numbers)
[0, 1, 4, 3, 16, 5, 36, 7, 64, 9]

2-2.他のデータ型からリストをつくる

list()関数を使ったリストの作成

◯list()関数を使えば、他のオブジェクトをリストにすることができます。

#文字列をリストに変換する
list('book')
#文字列をリスト化した場合、文字の1つ1つがリストの要素となる
['b','o','o','k']

split()関数を使ったリストの作成

◯split()関数を使えば、何らかのセパレータ文字列に基づいて、文字列を分割してリストにすることができます。

#オブジェクト birthday に中身をいれる
birthday = '29/9/1993'
#どこで分割したいかを決めて(今回はスラッシュ = /)分割する
birthday.split('/')
['9','29','1993']

2-3.要素の取得

[offset]を使った要素の取得

◯[offset]を使ってリストから要素を取り出すことができます。
一番左の要素のオフセットは、0であることに注意してください。

#文字列を要素に持つリストをつくる
color_list = ['Red','Yellow','Green']
#オフセットで指定したリストの要素を取得する
print(color_list[0])
print(color_list[2])
print(color_list[-1])
'Red'
'Green'
'Green'

リストの要素数が多い場合などは、リストの後ろから、-1,-2...という風にインデックスを使って、要素を指定することができます。

今回の場合では、文字列'Green'をオフセットを使って、左から指定する場合は、color_list[2]となり、リストの最後から負のインデックスを使って、指定する場合は、color_list[-1]となります。


enumerate()関数を使った要素とインデックスの取得

◯enumerate()関数を使うと、効率的に要素とインデックスを取得することができます。

enumerate0.py
#オブジェクト(変数)sに文字列を代入する
s = 'TOKYO'
#forループを使って、効率的に要素(item)とそのインデックス(offset)を取得する
for (offset,item) in enumerate(s):
    print(item,' のインデックスは ',offset)
T のインデックスは 0
O のインデックスは 1
K のインデックスは 2
Y のインデックスは 3
O のインデックスは 4
enumerate1.py
#色の要素のリストをつくる
color_list = ['Red','Yellow','Green','Blue','White']

#リストから要素(文字列)とそのインデックスを取得する
for i,color in enumerate(color_list):
    print(color,' は ',i,' 番目です')
Red は 0 番目です
Yellow は 1 番目です
Green は 2 番目です
Blue は 3 番目です
White は 4 番目です

スライスを使った複数の要素の取得

◯スライスを使って複数の要素を取り出すことができます。
リストをスライスしたものもリストになります。

[start:end]で要素を取得する場合は、オフセットでstartからend-1までの要素を取得します。("2-3.要素の更新"にスライスの詳しい説明があります。)

alphabet = ['A','B','C','D','E']
slice0.py
#オフセットで、0から2(3-1)の要素を取得することができます。
alphabet[0:3]
['A', 'B', 'C']

ステップを使った複数の要素の取得

slice1.py
#リストの先頭から2つ分のステップ(一つおきに)で要素を取得する
alphabet[::2]
['A', 'C', 'E']

◯マイナスを使うと末尾から要素を取得することができます

slice2.py
#リストの末尾から2つ分のステップ(一つおきに)で要素を取得する
alphabet[::-2]
['E', 'C', 'A']

◯ステップを応用するとリストの要素を逆順にすることができます↓

slice3.py
#リストの要素を末尾から順に取得する
alphabet[::-1]
['E','D','C','B','A']

2-4.要素の更新

[オフセット]を使った要素の書き換え

#アジアの国名のリストをつくる
asian_countries = ['China','India','Japan']

#リストの左から2番目の要素に'Russia'を代入する
asian_countries[1] = 'Russia'
print(asian_countries)

スライスを使った要素の更新

◯スライスを使えば、指定した範囲にある要素を取得して、それを置き換えることができます。

[:]先頭から末尾までの要素を取得する
[start:]startオフセットから末尾までの要素を取得する 
[:end]先頭からend-1オフセットまでの要素を取得する
[start:end]startオフセットからend-1オフセットまでの要素を取得する
[start:end:step]startオフセットから、stepごとに、end-1オフセットまでの要素を取得する。


[:]を使った要素の更新

◯リストを丸々更新します。

numbers = [1,2,3,4,5,6,7,8,9]

#先頭から末尾まで全ての要素を取得して、置き換えます。
numbers[:] = ['one','two','three','etc']
print(numbers)
['one','two','three','etc']

[start:]を使った要素の更新

◯指定した場所から末尾までの要素を置き換えます。
代入のようなイメージです。

numbers = ['one','two','three','etc']

#オフセット3から末尾までの要素を指定して置き換える
numbers[3:] = ['four','five','six']
print(numbers)
['one', 'two', 'three', 'four', 'five', 'six']

[:end]を使った要素の更新

◯先頭からend-1までの要素を取得して置き換えます。

numbers = [4,5,6,7,8,9]

#先頭からend-1、つまり0から-1の範囲の要素を取得して置き換えます。
#-1から0までのスペースにリスト[1,2,3]を代入するイメージです。
numbers[:0] = [1,2,3]
print(numbers)
[1,2,3,4,5,6,7,8,9]

[start:end]を使った要素の更新

◯オフセットで、start <= 要素 < end の範囲を取得して、置き換えます。

numbers = [1,2,3,4,5,6,7,8,9]

#オフセットで、0から2(3-1)までの範囲の要素を取得して、置き換えます。
numbers[0:3] = ['one','two','three']
print(numbers)
['one', 'two', 'three', 4, 5, 6, 7, 8, 9]

[start : end : step] を使った要素の更新

◯startからend-1の範囲で、stepごとに要素を取得して置き換えます。

numbers = [1,2,3,4,5,6,7,8,9]

#オフセット2から3つおきに要素を取得して、それをリスト['three','six','nine']と置き換えます。
numbers[2::3] = ['three','six','nine']
print(numbers)
[1, 2, 'three', 4, 5, 'six', 7, 8, 'nine']

2-5.要素の追加

append()関数を使った要素の追加

◯末尾に要素を追加します。

ex0.py
#アジアの国名のリストをつくる
asian_countries = ['China','India','Japan']

#末尾に要素を追加する
asian_countries.append('Russia')
print(asian_countries)
['China', 'India', 'Japan','Russia']

insert()関数を使った要素の追加

◯オフセットを使って、指定した場所に要素を追加します。

asian_countries = ['China','India','Japan']

#リストのオフセット2のところに文字列'Indonesia'を追加する。
asian_countries.insert(2,'Indonesia')
['China', 'India', 'Indonesia', 'Japan']

2-6.要素の削除

delと[オフセット]を使った要素の削除

◯del リストの名前[オフセット]という形で、指定した要素を削除します。

asian_countries = ['China','India','Indonesia','Japan']

#delはPythonの文で、代入(=)の逆のようなもの。
#delはメソッドではない
del asian_countries[2]
print(asian_countries)
['China','India','Japan']

remove()関数を使った要素の削除

◯消したい要素がどこにあるかわからない場合などに使います。

asian_countries = ['China','India','Indonesia','Japan']

#要素を指定して削除する
asian_countries.remove('Indonesia')
print(asian_countries)
['China','India','Japan']

pop()関数を使った要素の削除

◯リストから要素を取り出し、それと同時にその要素を削除することができます。

asian_countries = ['China','India','Indonesia','Japan']

#要素を指定して削除する
print(asian_countries.pop(2))
Indonesia
print(asian_countries)
['China','India','Japan']

2-7.要素の並べ替え

sort()関数を使った並べ替え

◯その場でリストをソートします。デフォルトは昇順です。文字列の場合は、アルファベット順です。

alphabet = ['A','E','D','C','B']

#並べ替える文字列は全て同じ型である必要がある
alphabet.sort()
print(alphabet)
['A', 'B', 'C', 'D', 'E']

sorted()関数を使った並べ替え

◯リストをコピーしてそれをソートします。なのでリストのオリジナルは変更されません。

#整数と浮動小数点数は、混じっていてもソートできる
numbers = [ 2 , 1.5 , 1 , 0 , 0.5 , 2.5]

#新しいリストsorted_numbersをつくって
#numbersリストをソートしたものを代入する
sorted_numbers = sorted(numbers)

print('sorted_numbers =' , sorted_numbers)
print('numbers =' , numbers)
sorted_numbers = [0, 0.5, 1, 1.5, 2, 2.5]
numbers = [2, 1.5, 1, 0, 0.5, 2.5]

2-8.リストのリスト

◯Pythonのリストは、Pythonオブジェクトを要素とすることができます。
なので、リストそのものも、他のリストの一要素として扱うことができます。

#国の名前のリストをつくる
asia = ['China','India','Indonesia']
americas = ['USA','Brazil','Mexico']
africa = ['Nigeria','Ethiopia','Egypt']
#リストを含むリストをつくる
countries = [asia,americas,africa,'Japan']
ex0.py
#リストを含むリストを表示する
print(countries)
[['China', 'India', 'Indonesia'], ['USA', 'Brazil', 'Mexico'], ['Nigeria', 'Ethiopia', 'Egypt'], 'Japan']
ex1.py
#オフセットでリストの中の要素を指定する
print(countries[0])
['China', 'India', 'Indonesia']

◯countriesリストの中のオフセット1の要素(americasリスト)中の、オフセット2の要素を取得します

ex2.py
#2段階で要素を指定する
print(countries[1][2])
Mexico

2-9.リストの結合

extend()関数を使ったリストの結合

◯extend()関数を使って、2つのリストを結合します。
リストの中の要素が全て1つのリストの中に入ります。

list1 = ['a','b','c']
list2 = ['d','e','f']

#2つのリストを結合して新しいリストにする
list1.extend(list2)
print(list1)
['a', 'b', 'c', 'd', 'e', 'f']

+=を使ったリストの結合

+=を使って、2つのリストを結合します。

list_a = [1,2,3]
list_b = [4,5,6]

#2つのリストを結合して新しいリストにする
list_a.extend(list_b)
print(list_a)
[1,2,3,4,5,6]

※同じ状況で、append()を使ったら、リストが一つの要素として、他のリストに追加されます。

list_a = [1,2,3]
list_b = [4,5,6]

#リストが一要素として他のリストに追加される
list_a.append(list_b)
print(list_a)
[1,2,3,[4,5,6]]

2-10.その他の操作

index()関数を使ったオフセットの取得

◯要素のオフセットを知りたい場合に使います。

asian_countries = ['China','India','Indonesia','Japan']

#文字列'Japan'のオフセットを取得する
print(asian_countries.index('Japan'))
3

inを使った値の有無のテスト

asian_countries = ['China','India','Indonesia','Japan']

#ある値がリストの中にあるかどうかを知る
print('Japan' in asian_countries)
print('Russia' in asian_countries)
True
False

count()関数を使った、値の個数の計算

#文字列をリスト化したものを変数charactersに代入する
characters = list('personal_computer')
print(characters)

['p', 'e', 'r', 's', 'o', 'n', 'a', 'l', '_', 'c', 'o', 'm', 'p', 'u', 't', 'e', 'r']

#charactersというリストの中に 'o' がいくつ含まれているかを調べる
print(characters.count('o'))
2

len()関数を使った長さの取得

#リストcharactersの要素の数を調べる
print(len(characters))
17

最後に

読んでいただきありがとうございました。
次はリストについてもう少し詳しく書いていきたいと思います。
間違いや改善点などございましたら、ご指摘の程よろしくお願い致します。

3
6
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6