前提・実現したいこと
python v3.7.4で、List内のSetを特定の条件で高速に結合したいです。
具体的には、以下の様なListをインプットとして、
例) all_groups: List[Set[int]] = [{1, 2}, {2, 3}, {4, 5, 6}, {7, 8, 9}, {6, 8, 9}, {8, 10}, {11, 12}, {1, 2}, {2, 3}]
List内のSet同士を比較し、Set内に同一の数字が含まれる場合はSetを結合していき、最終的に
例) unified_groups: List[Set[int]] = [{1, 2, 3}, {4, 5, 6, 7, 8, 9, 10}, {11, 12}]
の様なリストを作成したいです。
実際には、all_groups
のサイズが数百万〜数千万件あり、メモリやCPUなどのリソースは潤沢という前提で、これをなるべく早く処理したいのですが、冴えた方法が思いつかず、良い方法があれば教えていただけると非常に助かります。
試したこと
昨日から、以下のコードで実行してみてるのですが、数千万件を処理すると1日経っても返ってこない状況です。
python
1from typing import List, Set 2 3def unify_group(all_groups: List[Set[int]]) -> List[Set[int]]: 4 unified_groups: List[Set[int]] = [] 5 for group in all_groups: 6 # 交差集合のリストを取得 7 detected_unified_groups: List[Set[int]] = [] 8 for unified_group in unified_groups: 9 if unified_group.isdisjoint(group) is False: 10 detected_unified_groups.append(unified_group) 11 12 if len(detected_unified_groups) == 0: 13 # 交差集合がなければ、groupをそのまま追加 14 unified_groups.append(group) 15 else: 16 # 交差集合があれば、既存グループを削除して、groupとdetected_unified_groupの和集合を追加 17 unified_group: Set[int] = set() 18 for detected_unified_group in detected_unified_groups: 19 unified_groups.remove(detected_unified_group) 20 unified_group = unified_group.union(detected_unified_group) 21 unified_groups.append(unified_group) 22 23 return unified_groups
回答3件
あなたの回答
tips
プレビュー