😀

Pythonリストの要素を条件で複数のリストに分類する

2022/07/22に公開

最初に

リストに格納されている値、あるいはオブジェクトをいくつかのグループに分割したいことはありませんか?

0から99までの整数を奇数と偶数に分ける

内包表記を使って書くと・・・

けど、これって分類してるのではなくて生成してますね。

if __name__ == '__main__':
    nums = list(range(100))
    odd = [x for x in nums if x & 1]
    even = [x for x in nums if not x & 1]
 
    print(odd, even)

for 文を使って書く・・・

if __name__ == '__main__':
    nums = list(range(100))
 
    odd = []
    even = [] 
    for x in nums:
        (odd if x & 1 else even).append(x)
 
    print(odd, even)

長い長い・・・。かっこよくない。

reduce を使う

reduce に初期値として dict を与えて、リストの各要素の値に応じてリストに追加していく.
このやり方であれば、1つのループで実現できるし、リストの要素がオブジェクトで、そのオブジェクトによって複数に分類したい場合でも応用できる。

def classification(acc, num):
    if num & 1:
        acc['odd'].append(num)
    else:
        acc['even'].append(num)

    return acc


if __name__ == '__main__':
    nums = list(range(100))

    from functools import reduce
    result = reduce(
        classification,
        nums,
        {
            'odd': [],
            'even': []
        }
    )

    print(result['odd'], result['even'])

Discussion