Python リスト型

スポンサーリンク
スポンサーリンク

特徴

  • 異なるデータ型の要素を格納可能
  • 長さ(要素数)が可変
  • 要素の書き換え可
  • インデックス(番号)で要素にアクセス
  • スライスが可能
  • 二次元、多次元配列が可能

初期設定

data = [1, 2, 3, 4, 5]

# 二次元配列
data = [[1,2,3],[4,5,6]]

# 多次元配列
data = [[[1,2,3],[4,5,6],[1,2,3],[4,5,6],[1,2,3],[4,5,6]],[[1,2,3],[4,5,6],[1,2,3],[4,5,6],[1,2,3],[4,5,6]]]

# Rangeから作成
data = list(range(1, 6)) # [1, 2, 3, 4, 5]となる。 

値の取得

指定した位置(インデックス)の値を取得

data = [1, 2, 3, 4, 5]
print(data[0])
# 1

# 二次元配列 
data = [[1,2,3],[4,5,6]]

print(data[0][0])
# 1

指定した値の位置(インデックス)を取得

data = [1, 2, 3, 4, 5, 2]

print(data.index(2))
# 1
同じ値がある場合は、はじめの位置を返します。

最大値・最小値を取得

  • 最大値:max(data)
  • 最小値:min(data)
data = [1, 2, 3, 4, 5, 2]

print(max(data))
print(min(data))
# 5
# 1

平均値を取得

関数がありませんので。Numpyを利用しましょう。

import numpy as np

data = [1, 2, 3, 4, 5, 2]

print(np.mean(data))
# 2.8333333333333335

値の変更

data = [1, 2, 3] 
data[1] = 4
print(data) #[1, 4, 3]となる。

値の置換

data = ['1-XXXaaa', '2-XXXbbb', '3-YYYaaa']
data_replace = [s.replace('XXX', 'ZZZ') for s in data]
print(data_replace) # ['1-ZZZaaa', '2-ZZZbbb', '3-YYYaaa']となる。
小難しいように見えますがループさせているだけです。
このような記述をリスト内包表記といいます。

追加

末尾に追加

data = [1, 2, 3, 4, 5]
data.append(6)
print(data) # [1, 2, 3, 4, 5, 6]となる。
data = data.append(6)としない。

指定の位置に追加(挿入)

data = [1, 2, 3] 
data.insert(0, 4)
print(data) # [4, 1, 2, 3]となる。
appendとinsertでリストを追加するとそのままリストが追加されるので注意してください。以下のリストの結合を見てください。

リストの結合

data_A = [1, 2, 3]
data_B = [4, 5, 6]
data = data_A + data_B
print(data) # [1, 2, 3, 4, 5, 6]となる。
結合は足すだけです。

指定位置に結合(スライスを使う

data = [1, 2, 3] 
data[2:1] = [4, 5, 6]
print(data) #[1, 4, 5, 6, 2, 3]となる。

その他の方法

data_A = [1, 2, 3] 
data_B = [4, 5, 6]
data_A.extend(data_B)
print(data_A) # [1, 2, 3, 4, 5, 6]となる。
足すだけと同じ結果になるので意味がないかと思う。

削除

# 指定した位置の要素を削除
data.pop(0)

# 指定した値と同じ要素を検索し、最初の要素を削除
data.remove('abc')
popとremoveの使い分けに注意しましょう。

スライスを使う方法

# 指定した要素を削除
data = [1, 2, 3, 4, 5]
del data[0]
print(data) # [2, 3, 4, 5]となる。

# 指定した要素を削除(マイナスで指定すると逆から数える
data = [1, 2, 3, 4, 5]
del data[-2]
print(data) # [1, 2, 3, 5]となる。

# 指定した範囲を削除
data = [1, 2, 3, 4, 5]
del data[2:4] # 2個目以上、4個目未満
print(data) # [1, 2, 5]となる。
範囲を指定する際は、未満となるので注意しましょう。

重複の削除(排他)

基本

set()でset型のデータに変換します。その後、list()でリスト型に戻すことができます。
二次元配列ではエラーになります。

data = [5, 2, 4, 1, 3, 5, 3, 2]

data = set(data)
print(data)
# {1, 2, 3, 4, 5}

print(list(data))
# [1, 2, 3, 4, 5]

データの順番(順序)を元のままにする場合

sorted(, key=data.index)を組み合わせて変換します。

data = [5, 2, 4, 1, 3, 5, 3, 2]

data = sorted(set(data),  key=data.index)
print(data)
# [5, 2, 4, 1, 3]

二次元配列の重複排他

Pythonには二次元配列の重複排他の関数は用意されていませんので自分で作る必要があります。

以下は、私が考えた完全一致と配列の指定要素の一致(部分一致)のサンプルになります。

# 完全一致
temp = []
data2 = [val for val in data if val not in temp and not temp.append(val)]
print(data2)
# [[5, 2], [4, 1], [1, 3], [1, 2]]

# 第1のみ一致(部分一致)
temp = []
data2 = [val for val in data if val[0] not in temp and not temp.append(val[0])]
print(data2)
# [[5, 2], [4, 1], [1, 3]]

値の有無

完全一致

data = ['aaa', 'bbb', 'ccc']
if 'aaa' in data:
    print("YES")

部分一致

# 部分一致
data = ['aaa', 'bbb', 'ccc']
if len([i for i in data if 'a' in i]) > 0:
    print("YES")

# 前方一致
if len([i for i in data if i.startswith('a')]) > 0:
    print("YES")

# 後方一致
if len([i for i in data if i.endswith('a')]) > 0:
    print("YES")
私の知っている限りでは、簡単にはLIKE検索ができません。
多少、強引ですが上記で対応できます。

要素の個数

全ての要素数

data = ['aaa', 'bbb', 'ccc']
print(len(data)) # 3となる
if文などで要素の有無をチェックするのにも使えます。

指定した値と同じ値を持つ要素数

data = ['aaa', 'bbb', 'ccc']
print(data.count('aaa')) # 1となる。
lenとcountのの書式が違うので混乱しないようにしましょう。

合計・最大値・最小値を取得

  • 合計:sum(data)
  • 最大値:max(data)
  • 最小値:min(data)
data = [1, 2, 3, 4, 5]

print(sum(data))
# 15

print(max(data))
# 5

print(min(data))
# 1

平均値を取得

標準モジュールのstatisticsのmeanを使用します。インポートをする必要があります。

from statistics import mean

data = [1, 2, 3, 4, 5]

print(mean(bbb.values()))
# 0.6170637988958826

位置を取得

data = ['aaa', 'bbb', 'ccc']
print(data.index('aaa')) # 0となる。

ソート(データの順番を変更)

基本的なソート

data.sort(reverse=True)

  • dataがリスト型データになります。
  • 元のデータがソートされます
  • reverseTrueで降順、Falseで昇順になります。デフォルトはFalse
data = [2, 0, 3, 1]
print(data)
# [2, 0, 3, 1]

data.sort()
print(data)
# [0, 1, 2, 3]

data.sort(reverse=True)
print(data)
# [3, 2, 1, 0]

元データを変更しないソート

dara_new = sorted(data, reverse=True)

  • dataがリスト型データになります。
  • dara_newはソートされた新たなデータになります。
  • 元のデータはソートされません
  • reverseTrueで降順、Falseで昇順になります。デフォルトはFalse
data = [2, 0, 3, 1]
print(data)
# [2, 0, 3, 1]

dara_new = sorted(data)
print(data)
# [2, 0, 3, 1]

print(dara_new)
# [0, 1, 2, 3]

dara_new = sorted(data, reverse=True)
print(data)
# [2, 0, 3, 1]

print(dara_new)
# [3, 2, 1, 0]

要素の順番をランダムにシャッフル(入れ替え)

標準ライブラリのrandomを利用します。標準ですのでインストールは不要です。

方法は2つあります。

  • random.sample():元のデータはシャッフルされません。
  • random.shuffle():元のデータをシャッフルします。
import random

data = [1, 2, 3, 4, 5]

new_data = random.sample(data, len(data))

print(data)
# [1, 2, 3, 4, 5]

print(new_data)
# [3, 4, 1, 2, 5]

random.shuffle(data)
print(data)
# [3, 4, 5, 2, 1]

 

タイトルとURLをコピーしました