【Python】Python ~ 基本編 / リスト・あれこれ ~

■ はじめに

https://dk521123.hatenablog.com/entry/2019/10/12/084943

の続き。

リストの記事が長くなったので、整理して分冊。

また、Pythonの資格の問題ででてきたスライスなど
あまり使っていなかったものを整理。

Python に関する資格
https://dk521123.hatenablog.com/entry/2019/12/17/225829

目次

【1】間違えやすい文法
 1)スライス
 2)負のインデックス
 3)リスト内包表記(List comprehensions)
【2】リスト・あれこれ
 1)空リストの定義とその判定
 2)ソート
 3)要素のクローン
 4)要素のカウント
 5)合成(+)
 6)分割(文字列⇒リスト)
 7)join(リスト⇒文字列)
 8)typing
 9)reprlib
 10)抽出と除外

【1】間違えやすい文法

1)スライス

[start:end:step] のように値が指定できる

例1

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

print(a[2:8]) # [2, 3, 4, 5, 6, 7]
print(a[:5]) # [0, 1, 2, 3, 4]
print(a[5:]) # [5, 6, 7, 8, 9]
print(a[2:8:2]) # [2, 4, 6]

例2

values = "Hello World!!!"

print(values[:5])
print(values[6:11])

# 出力結果
# Hello
# World

https://qiita.com/okkn/items/54e81346d8f35733ab5e

2)負のインデックス

* 後ろから数えて何番目かという指定になる

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

print(a[-1]) # 9
print(a[-2]) # 8

3)リスト内包表記(List comprehensions)

サンプル

# ↓のような書き方を「リスト内包表記(List comprehensions)」という
list = [x**2 for x in range(10)]
print(list) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# ネストも可能
list2 = [(x, y) for x in range(2) for y in range(3)]
print(list2) # (0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]   

【2】リスト・あれこれ

 1)空リストの定義とその判定

サンプル

empty1_list = []
# [] と表示
print(empty1_list)
if not empty1_list:
  print("リストは空です")

empty2_list = list()
print(empty2_list)
if len(empty2_list) == 0:
  print("リストは空ですYO")
if empty2_list == []:
  print("リストは空ですYOYO")

https://qiita.com/yonedaco/items/d0f65ca3dad2e085a51d

2)ソート

サンプル

# sort() : 中身そのものがソートする
number = [1,5,3,4,2]
number.sort()
print(number)  # [1, 2, 3, 4, 5]が出力される。

# sorted() : 変数の中身そのものは変更しない
number = [1,5,3,4,2]
print(sorted(number))  # [1, 2, 3, 4, 5]が出力される。
print(number)  # [1, 5, 3, 4, 2]が出力される。

# 昇順/降順
print(sorted(words, reverse=True))
print(sorted(words, reverse=Flase))

補足:辞書リストのソート

以下の関連記事の「■ 辞書リストをソートする」を参照のこと

https://dk521123.hatenablog.com/entry/2019/10/27/100014

 3)要素のクローン

* [:]で行う

サンプル

fruits_clone = fruits[:]

4)要素のカウント

サンプル

name_list = ['Tom', 'Sam', 'Mike', 'Sam', 'Kevin', 'Sam', 'Mike', 'Sam',]

# count('【カウントしたい要素内容】')
print(name_list.count('Mike')) # 2

5)合成(+)

* リスト同士で「+」することができる

サンプル

first_list = [1, 2, 3]
second_list = [4, 5, 6]

total_list = first_list + second_list
# [1, 2, 3, 4, 5, 6]
print(total_list)

6)分割(文字列⇒リスト)

* split("【区切り文字】")を使う

サンプル

hello = "Hello World !!"
print(hello.split(" ")) # ['Hello','World','!!']が出力される。

7)join(リスト⇒文字列)

list = ['Mike', 'Tom', 'Sam']
result = '\n'.join(list)
print(result)

出力結果例

Mike
Tom
Sam

8)typing

https://docs.python.org/ja/3/library/typing.html

* 何もしない状態では、
 以下のようにListの中身の型を定義することはできない
 => 「from typing import List」を使えば大丈夫
* Typing モジュールに詳細は、以下の関連記事を参照のこと。

https://dk521123.hatenablog.com/entry/2021/12/23/231559

修正前(ダメな例・一部抜粋)

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

def print_list(sample_list: list[int]) -> None: # ここでエラー

修正後

from typing import List

def print_list(sample_list: List[int]) -> None:
  for input in sample_list:
    print("input = {}".format(input))

if __name__ == '__main__':
  sample_list = [1, 3, 2, 5, 4]
  print_list(sample_list)

9)reprlib

* 出力文字列の長さを制限する
 => デバッグログとして使えるかも

https://docs.python.org/ja/3/library/reprlib.html
https://www.st-hakky-blog.com/entry/2017/11/28/144751
サンプル

import reprlib

values = [i for i in range(10)]

print(values)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

print(reprlib.repr(values))
# [0, 1, 2, 3, 4, 5, ...]

10)抽出と除外

* 別の方法としては、「filter / lambda」があるが
 そちらの詳細は、以下の関連記事を参照のこと

Python ~ 基本編 / ラムダ lambda ~
https://dk521123.hatenablog.com/entry/2019/09/23/000000

サンプル

target_list = [
  "table1",
  "table2",
  "table3",
  "table4",
  "table1 -> table2",
  "table2 -> table3",
  "table2 -> table4"
]

# 抽出 (in)
list = [line for line in target_list  if 'table3' in line]
print(list)

print('*******************')

# 除外(not in)
list = [line for line in target_list  if 'table3' not in line]
print(list)

参考文献

https://www.atmarkit.co.jp/ait/articles/1905/31/news015_2.html

関連記事

Python ~ 基本編 / リスト ~
https://dk521123.hatenablog.com/entry/2019/10/12/084943
Python ~ 基本編 / スライス操作 ~
https://dk521123.hatenablog.com/entry/2020/11/14/000000
Python ~ 基本編 / 文字列 ~
https://dk521123.hatenablog.com/entry/2019/10/12/075251
Python ~ 基本編 / 型指定・Typing ~
https://dk521123.hatenablog.com/entry/2021/12/23/231559
Python ~ 基本編 / ラムダ lambda ~
https://dk521123.hatenablog.com/entry/2019/09/23/000000
Python に関する資格
https://dk521123.hatenablog.com/entry/2019/12/17/225829