Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでリストを任意の位置で分割してサブリストを作成する方法

データ分析の現場では、データを整形したり移動させたりといった複雑な処理が求められる場面が多くあります。そのような状況で役立つのが、1つの大きなリストを要件に応じて複数のサブリストに分割するテクニックです。本記事では、Pythonでリストを指定した位置で分割するための代表的なアプローチを、具体的なコード例とともに解説します。

方法1:zipとforループ(リスト内包表記)を使う

このアプローチでは、まずスライス(リストダイス)を使って分割開始位置から要素を取り出します。次に、zip関数とforループ(リスト内包表記)を組み合わせることで、分割ポイントごとにサブリストを生成します。[0] + split_pointssplit_points + [None]をペアにすることで、「先頭から最初の分割点まで」「分割点から次の分割点まで」「最後の分割点から末尾まで」という区間を自動的に作り出せるのがポイントです。

コード例

Alist = ['Mon', 'Tue', 'Wed', 6, 7, 'Thu', 'Fri', 11, 21, 4]

# 分割を行うインデックス
split_points = [2, 5, 8]

# 元のリスト
print("Given list : " + str(Alist))

# 分割位置の表示
print("The points of splitting : ", split_points)

# 分割を実行
split_list = [Alist[i: j] for i, j in zip([0] +
split_points, split_points + [None])]

# 結果の出力
print("The split lists are : ", split_list)

実行結果

上記のコードを実行すると、以下のような出力が得られます。

Given list : ['Mon', 'Tue', 'Wed', 6, 7, 'Thu', 'Fri', 11, 21, 4]
The points of splitting : [2, 5, 8]
The split lists are : [['Mon', 'Tue'], ['Wed', 6, 7], ['Thu', 'Fri', 11], [21, 4]]

この例では、インデックス2、5、8を境界として、元のリストが「['Mon', 'Tue']」「['Wed', 6, 7]」「['Thu', 'Fri', 11]」「[21, 4]」という4つのサブリストに分割されています。

方法2:itertools.chainとzipを使う

itertools.chainは、最初のイテラブルの要素をすべて返し尽くした後、次のイテラブルの要素へと順番に進んでいくイテレータを生成する関数です。これにより、分割すべき位置を明確にマークできます。その後、zip関数で開始位置と終了位置をペア化し、それぞれの区間をスライスすることでサブリストへとまとめます。この方法はイテレータベースのため、大きなデータを扱う場合にもメモリ効率に優れています。

コード例

from itertools import chain
Alist = ['Mon', 'Tue', 'Wed', 6, 7, 'Thu', 'Fri', 11, 21, 4]

# 分割を行うインデックス
split_points = [2, 5, 8]

# 元のリスト
print("Given list : ", str(Alist))

# 分割位置の表示
print("The points of splitting : ", split_points)

# カスタムリスト分割の実行
sublists = zip(chain([0], split_points), chain(split_points, [None]))
split_list = list(Alist[i : j] for i, j in sublists)

# 結果の出力
print("The split lists are : ", split_list)

実行結果

上記のコードを実行すると、以下のような出力が得られます。

Given list : ['Mon', 'Tue', 'Wed', 6, 7, 'Thu', 'Fri', 11, 21, 4]
The points of splitting : [2, 5, 8]
The split lists are : [['Mon', 'Tue'], ['Wed', 6, 7], ['Thu', 'Fri', 11], [21, 4]]

まとめ

どちらの方法も同じ結果になりますが、使い分けの目安があります。シンプルに書きたい場合はリスト内包表記とzipを組み合わせた方法1が読みやすく、大量のデータや既存のイテレータを扱う場合はitertools.chainを使った方法2がメモリ効率の面で有利です。用途に応じて最適な手法を選択しましょう。

  1. Pythonでリストからバイグラム(Bigram)を生成する方法

    バイグラム(bigram)とは、文章中の連続する2つの単語をペアとして組み合わせたものです。Pythonでは、この手法がテキスト分析の分野で広く活用されています。本記事では、与えられた文からバイグラムを生成する2つのアプローチを紹介します。 enumerate()とsplit()を使う方法 まずsplit()メソッドで文を単語に分割し、その後enumerate()関数を使って隣接する単語同士をペアにしていきます。インデックス番号を利用することで、各単語とその次の単語を効率的に組み合わせられるのがポイントです。 サンプルコード list = [Stop. look left right. go]

  2. Pythonで文字列を単語のリストに変換する方法

    文字列を単語のリストに変換したい場合は、空白文字を基準に文字列を分割するだけで実現できます。最もシンプルな方法は、文字列クラスが標準で提供している split() メソッドを使うことです。このメソッドのデフォルトの区切り文字は空白であり、文字列に対して呼び出すと、空白文字の位置で自動的に分割してくれます。split()メソッドを使う方法引数を指定せずに split() を呼び出すだけで、連続する空白もまとめて処理され、単語ごとのリストが返されます。コード例>>> Please split this string.split() [Please, split, this, st