Pythonでリスト間の互いに素な文字列の組み合わせを求める方法
Pythonでは、複数のリストにまたがって「互いに素(ディスジョイント)」な文字列、つまり共通する要素を一切持たない文字列の組み合わせを求めたいケースがあります。本記事では、2つの引数を受け取るメソッドを定義し、lambda式とreduceメソッド、さらにif条件を組み合わせてこの問題を解決する方法を紹介します。
なお「互いに素」とは集合論の用語で、2つの集合の間に共通する要素が1つも存在しない状態を指します。文字列同士の場合は、「共有する文字が1つもない」関係に相当します。
サンプルコード
from functools import reduce
def determine_disjoint_pairs(disjoint_data, my_result=[]):
if not disjoint_data and not reduce(lambda a, b: set(a) & set(b), my_result):
yield tuple(my_result)
elif disjoint_data:
yield [idx for k in disjoint_data[0] for idx in determine_disjoint_pairs(disjoint_data[1:], my_result + [k])]
my_list_1 = ["python", "is", "fun"]
my_list_2 = ["its", "awesome", "learning"]
print("The first list is : ")
print(my_list_1)
print("The second list is :")
print(my_list_2)
my_result = list(determine_disjoint_pairs([my_list_1, my_list_2]))
print("The result is :")
print(my_result)
実行結果
The first list is :
['python', 'is', 'fun']
The second list is :
['its', 'awesome', 'learning']
The result is :
[('fun', 'its'), ('fun', 'awesome')]
コードの解説
determine_disjoint_pairsという名前のメソッドを定義し、2つのパラメータを受け取ります。最初のパラメータが空であり、かつ
reduceとlambdaを用いた条件式が偽である場合、yield演算子によって結果を生成します。この際、結果はタプルに変換されます。それ以外の場合は、
yield演算子とリスト内包表記を組み合わせ、異なる引数セットでメソッド自身を再帰的に呼び出します。メソッドの外側では、2つの文字列リストを定義し、コンソールに表示します。
これら2つのリストを引数として渡してメソッドを呼び出します。
戻り値はリストに変換され、変数に代入されます。
最後に、その変数の内容がコンソールへ出力されます。
実行結果からわかるように、'python'や'is'は他の単語と共通する文字を持つため候補から除外され、'fun'と'its'、'fun'と'awesome'という、互いに共通文字を持たないペアだけが結果として得られます。このように、ジェネレーターと再帰を組み合わせることで、条件を満たす組み合わせを簡潔に抽出できます。
-
Pythonで文字列のリストを並べ替える方法:sort()とsorted()の使い分け
Pythonでは、文字列のリストを並べ替える方法が2つ用意されています。リスト自体を直接変更するsort()メソッドと、元のリストを保持したまま新しい並べ替え済みリストを作成するsorted()関数です。それぞれの特徴と使い方を解説します。 sort()メソッドでリストをその場で並べ替える sort()は、リストそのものを並べ替える「in-place(破壊的)」な操作です。元のリストの順序が直接変更されるため、戻り値を受け取る必要はありません。 >>> a = [Hello, My, Followers] >>> a.sort() >>>
-
Pythonリスト入門:作成から操作、削除まで徹底解説
このチュートリアルでは、Pythonのリスト(List)について学びます。リストの作成方法、要素へのアクセス、要素の追加・削除、リスト自体の削除など、基本的な操作を一つずつ丁寧に解説していきます。 Pythonでは、リストは角括弧 [] を使って構築し、各要素はカンマ , で区切って記述します。 Pythonのリストは、異なる型のオブジェクトを混在させて格納できるのが特徴です。すべて文字列である必要も、整数である必要もありません。例えば、以下のように複数の型が混ざったリストを作成できます。mixedTypesList = [a, True, 1, 1.0] リストの作成方法 リストは、角括弧