Closed4

Python3_sort, itemgetter関数, attrgetter関数

かじるかじる

Python実践レシピより

Python3エンジニア認定実践試験メモ

ソート(非破壊)

main.py
# ソート(数値)
nums = [0, 4, 1, 2, 3, 5]
print(sorted(nums))
# [0, 1, 2, 3, 4, 5]
print(sorted(nums, reverse=True))
# [5, 4, 3, 2, 1, 0]

# ソート(文字列)
foods = ["spam", "ham", "egg"]
print(sorted(foods))
# ['egg', 'ham', 'spam']
print(sorted(foods, reverse=True))
# ['spam', 'ham', 'egg']

# ソート(タプル型) -> リスト型で返る
nums = (0, 4, 1, 2, 3, 5)
print(sorted(nums))
# [0, 1, 2, 3, 4, 5]
print(sorted(nums, reverse=True))
# [5, 4, 3, 2, 1, 0]

# ソート(辞書型) -> キーのリストで返る
nums = {"a": 1, "c": 3, "b": 2}
print(sorted(nums))
# ['a', 'b', 'c']
print(sorted(nums.items()))
# [('a', 1), ('b', 2), ('c', 3)]

# リバース -> リストではなく、イテレーターが返る
nums = [0, 4, 1, 2, 3, 5]
print(reversed(nums))
# <list_reverseiterator object at 0x10a4f9f30>
print(list(reversed(nums)))# 並び順を逆にする
# [5, 3, 2, 1, 4, 0]
かじるかじる

ソート(破壊的)

main.py
# ソート(数値)
nums = [0, 4, 1, 2, 3, 5]

nums.sort()
print(nums)
# [0, 1, 2, 3, 4, 5]

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

# リバース
nums.reverse()
print(nums)
# [0, 1, 2, 3, 4, 5]

# key引数(引数無し)
strs = ["c", "D", "B", "a"]
print(sorted(strs))
# ['B', 'D', 'a', 'c']

# keys引数(小文字にして比較)
print(sorted(strs, key=str.lower))
# ['a', 'B', 'c', 'D']
かじるかじる

ソート(itemgetter関数)

main.py
from operator import itemgetter, attrgetter
from datetime import date
from dataclasses import dataclass

#==========
# itemgetter関数
data = [(1, 40, 200), (3, 10, 100), (2, 20, 300), (1, 30, 300)]

# indexを順番に比較してソート
print(sorted(data))
# [(1, 30, 300), (1, 40, 200), (2, 20, 300), (3, 10, 100)]

# indexの2でソートし、それ以外は元の順番
print(sorted(data, key=itemgetter(2)))
# [(3, 10, 100), (1, 40, 200), (2, 20, 300), (1, 30, 300)]

# indexの2でソートし、次に0でソートしそれ以外は元の順番
print(sorted(data, key=itemgetter(2, 0)))
# [(3, 10, 100), (1, 40, 200), (1, 30, 300), (2, 20, 300)]

# 辞書の値でソート
dic = {"a": 2, "c": 1, "b": 3}
print(sorted(dic.items(), key=itemgetter(1)))# 値なので1
# [('c', 1), ('a', 2), ('b', 3)]

# 辞書のキーを指定してソート
member = [
	{"name": "yusha", "gold": 300},
	{"name": "senshi", "gold": 400},
	{"name": "soryo", "gold": 200},
	{"name": "maho", "gold": 100}
]
# 所持金でソート
print(sorted(member, key=itemgetter("gold")))
# [{'name': 'maho', 'gold': 100}, 
# {'name': 'soryo', 'gold': 200}, 
# {'name': 'yusha', 'gold': 300}, 
# {'name': 'senshi', 'gold': 400}]
かじるかじる

ソート(attrgetter関数)

main.py
from operator import itemgetter, attrgetter
from datetime import date
from dataclasses import dataclass

#==========
# attrgetter関数
dates = [
	date(2024, 5, 8),
	date(2022, 2, 13),
	date(2023, 2, 9),
	date(2021, 12, 1)
]

# .monthでソート
print(sorted(dates, key=attrgetter("month")))

# .monthと.dayの値でソート
print(sorted(dates, key=attrgetter("month", "day")))

# クラス(dataclass)
@dataclass
class User:
	name: str
	gold: int

users = [
	User("yusha", 300),
	User("senshi", 400),
	User("sorho", 200),
	User("maho", 100)
]
# 所持金でソート
print(sorted(users, key=attrgetter("gold")))
# [User(name='maho', gold=100), 
#  User(name='sorho', gold=200), 
#  User(name='yusha', gold=300), 
#  User(name='senshi', gold=400)]
このスクラップは2ヶ月前にクローズされました