Pythonで異なるデータ型を含む行列(Matrix)から行を抽出する方法
異なるデータ型が混在する行列(リストのリスト)から、すべての要素のデータ型が互いに異なる行だけを抽出したい場合があります。このようなときは、行列を反復処理しながら「set(集合)」を使うことで、重複のないデータ型の種類数を簡単に求められます。
サンプルコード
以下に具体的な実装例を示します。
my_list = [[4, 2, 6], ["python", 2, {6: 2}], [3, 1, "fun"], [9, (4, 3)]]
print("元のリスト:")
print(my_list)
my_result = []
for sub in my_list:
# 各要素の型を取得し、setで種類数をカウント
type_size = len(list(set([type(ele) for ele in sub])))
# 要素数とデータ型の種類数が一致すれば抽出
if len(sub) == type_size:
my_result.append(sub)
print("データ型がすべて異なる行:")
print(my_result)実行結果
元のリスト:
[[4, 2, 6], ['python', 2, {6: 2}], [3, 1, 'fun'], [9, (4, 3)]]
データ型がすべて異なる行:
[['python', 2, {6: 2}], [9, (4, 3)]]コードの解説
まず、整数・文字列・辞書・タプルなど異なるデータ型を含むリストを定義し、コンソールに表示します。
結果を格納するための空のリスト
my_resultを用意します。元のリストを1行ずつ反復処理し、各行内のすべての要素について
type()関数でデータ型を判定します。得られた型のリストを
set()に変換することで重複が除去され、その後list()で再びリスト化します。集合のサイズ(=データ型の種類数)を
len()で求め、行内の要素数と比較します。両者が一致していれば、その行には同じデータ型が存在しない(すべて異なる)ことを意味するため、結果リストに追加します。
最終的に、条件を満たす行だけが出力としてコンソールに表示されます。
ポイントまとめ
この手法の核心は、「要素数とデータ型の種類数が一致するかどうか」という判定ロジックです。たとえば [4, 2, 6] のように3つの要素がすべて整数の場合、型の種類数は1となり要素数と一致しないため除外されます。一方、['python', 2, {6: 2}] は文字列・整数・辞書と3種類の型を持つため、抽出対象となります。同様に [9, (4, 3)] も整数とタプルで構成されているため該当します。
なお、Pythonでは True と 1 が同一視される点など、bool型の扱いには注意が必要です。より厳密な判定が必要な場合は、型名を文字列化して比較するなどの工夫も有効です。
-
Pythonで2次元バイナリ行列から異なる島の形状を検出するプログラム
問題の概要2次元のバイナリ行列が与えられ、その中に存在する「異なる島」の数を求めることを考えます。ここで、1 は陸地、0 は水を表します。島とは、上下左右に隣接した 1 の集合であり、その周囲がすべて水に囲まれている領域のことです。そして、2つの島は形状が異なる場合にのみ「一意(ユニーク)」であるとみなされます。たとえば、入力が以下のような行列だったとします。100001010101101001001000011011この場合、出力は 4 になります(異なる島はそれぞれ別の色で表されています)。解法のアプローチこの問題は、深さ優先探索(DFS)を使って各島のセルをすべて訪問し、その形状を「相対
-
Pythonで文字列リストから数値を抽出する2つの方法:splitとmap/isnumericの使い方
Pythonでデータ処理を行っていると、文字と数字が混在し、かつ一定のパターンを持つリストに遭遇することがあります。例えば「曜日-数値」のように、識別子と数値が組み合わされたデータは実務でもよく見られます。 本記事では、このようなリストから数値部分だけを抽出し、その後の計算や集計に利用できるようにする方法を、2つのアプローチで解説します。 方法1:split関数を使う split() 関数は、指定した区切り文字を基準に文字列を分割します。以下の例では、リストの各要素がハイフン(-)によって文字部分と数値部分に区切られています。この特徴を利用し、リスト内包表記で各要素を処理することで、数値部分を