Closed4

Pythoon3_itertoolsモジュール, copyモジュール

かじるかじる

Python実践レシピより

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

イテレーターの操作1

main.py
import itertools

# イテレーターを連結する
it_chain = itertools.chain(["A", "B"], "cd", range(5))
for element in it_chain:
	print(element)
# A B c d 0 1 2 3 4 の順で出力

# イテレーターで連続値ごとにまとめる
text = "aaabbcdddaabb"
it_group = itertools.groupby(text)
for value, group in it_group:
	print(f"{value}: {list(group)}")
"""
a: ['a', 'a', 'a']
b: ['b', 'b']
c: ['c']
d: ['d', 'd', 'd']
a: ['a', 'a']
b: ['b', 'b']
"""

# あらかじめソートしておく
str_sorted = "".join(sorted(text))
it_sorted = itertools.groupby(str_sorted)
for value, group in it_sorted:
	print(f"{value}: {list(group)}")
"""
a: ['a', 'a', 'a', 'a', 'a']
b: ['b', 'b', 'b', 'b']
c: ['c']
d: ['d', 'd', 'd']
"""

# 関数の結果に従ってグループを作る
def is_odd(num):
	return num%2 == 1

nums = [10, 20, 31, 45, 50, 61]
it_odd = itertools.groupby(nums, is_odd)
for value, group in it_odd:
	print(f"{value}: {list(group)}")
"""
False: [10, 20]
True: [31, 45]
False: [50]
True: [61]
"""
かじるかじる

イテレーターの操作2

main.py
import itertools

# 利点: 
# ジェネレーターオブジェクトや、
# メモリに乗らない巨大なファイルの一部を
# 取り出す場面で特に有効

li_nums = list(range(10))
print(list(li_nums))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

li_slice1 = itertools.islice(li_nums, 5)
print(list(li_slice1))
# [0, 1, 2, 3, 4]

li_slice2 = itertools.islice(li_nums, 3, 8)
print(list(li_slice2))
# [3, 4, 5, 6, 7]

# 複数のイテレーターオブジェクトからタプルを作成

it1 = (1, 2, 3)
it2 = ["abc", "def", "ghi", "jkl"]
it3 = "ABCDE"

for value in zip(it1, it2, it3):
	print(value)

"""
(1, 'abc', 'A')
(2, 'def', 'B')
(3, 'ghi', 'C')
"""

# 最も多い要素に合わせてタプルを作成
for value in itertools.zip_longest(it1, it2, it3):
	print(value)

"""
(1, 'abc', 'A')
(2, 'def', 'B')
(3, 'ghi', 'C')
(1, 'abc', 'A')
(2, 'def', 'B')
(3, 'ghi', 'C')
(None, 'jkl', 'D')
(None, None, 'E')
"""
かじるかじる

順列と組み合わせ

main.py
import itertools

li_alpha = "ABC"
li_nums  = "12"

# 組み合わせ(デカルト積)
print(list(itertools.product(li_alpha, li_nums)))
# [('A', '1'), ('A', '2'), ('B', '1'), 
# ('B', '2'), ('C', '1'), ('C', '2')]

# 順列
print(list(itertools.permutations(li_alpha)))
# [('A', 'B', 'C'), ('A', 'C', 'B'), 
# ('B', 'A', 'C'), ('B', 'C', 'A'), 
# ('C', 'A', 'B'), ('C', 'B', 'A')]

# 順列(長さを2)
print(list(itertools.permutations(li_alpha, 2)))
# [('A', 'B'), ('A', 'C'), ('B', 'A'), 
# ('B', 'C'), ('C', 'A'), ('C', 'B')]

# 組み合わせ
print(list(itertools.combinations(li_alpha, 2)))
# [('A', 'B'), ('A', 'C'), ('B', 'C')]

# 組み合わせ(同じ値の繰り返しを含む)
print(list(itertools.combinations_with_replacement(li_alpha, 2)))
# [('A', 'A'), ('A', 'B'), ('A', 'C'), 
# ('B', 'B'), ('B', 'C'), ('C', 'C')]
かじるかじる

copyモジュール

main.py
import copy

# 参照を使ったコピー(参照する)
values = ["a", "b", "c", "d"]# リセット
copied = values
copied[1] = "B"
print(f"copied: {copied}")
# copied: ['a', 'B', 'c', 'd']
print(f"values: {values}")# 元のオブジェクトも変更されている
# values: ['a', 'B', 'c', 'd']

# copy関数を使ったコピー(クローン)
values = ["a", "b", "c", "d"]# リセット
copied = copy.copy(values)
copied[1] = "B"
print(f"copied: {copied}")
# copied: ['a', 'B', 'c', 'd']
print(f"values: {values}")# 元のオブジェクトは変更されない(成功)
# values: ['a', 'b', 'c', 'd']

# 2階層先の場合は参照になってしまう
values = [["a", "b"], ["c", "d"], ["e", "f"]]# リセット
copied = copy.copy(values)
copied[1][1] = "D"
print(f"copied: {copied}")
# copied: [['a', 'b'], ['c', 'x'], ['e', 'f']]
print(f"values: {values}")# 元のオブジェクトも変更されている(失敗)
# values: [['a', 'b'], ['c', 'D'], ['e', 'f']]

# deepcopy関数を使って再帰的にコピー(完全なクローン)
values = [["a", "b"], ["c", "d"], ["e", "f"]]# リセット
copied = copy.deepcopy(values)
copied[1][1] = "D"
print(f"copied: {copied}")
# copied: [['a', 'b'], ['c', 'D'], ['e', 'f']]
print(f"values: {values}")# 元のオブジェクトは変更されない(成功)
# values: [['a', 'b'], ['c', 'd'], ['e', 'f']]
このスクラップは2ヶ月前にクローズされました