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ヶ月前にクローズされました