前提・実現したいこと
Python3にて,サイズの異なる2つのリストを比較して,置換元のリストに対して,置換対象のリストの要素の順番通り一致した箇所があれば,その要素を置換したいと考えています.
少し言葉にしづらいので,具体的な動作を以下のコードで示します.
ソースコード
Python3
1rule = { 2 "STUDENT" : [["生徒"], ["学生"]], 3 "STUDENTS" : [["STUDENT", "たち"], ["STUDENT", "ら"]], 4 "TEACHER" : [["先生"], ["教師"], ["教員"]], 5 "TEACHERS" : [["TEACHER", "たち"], ["TEACHER", "ら"]], 6 "FRUIT_EAT" : [["リンゴ", "を", "食べた"], ["ミカン", "を", "食べた"]] 7} 8a = ["生徒", "が", "リンゴ", "を", "食べた"] 9b = ["教師", "たち", "は", "ミカン", "を", "食べた"] 10c = ["教員", "と", "学生", "ら", "は", "ブドウ", "を", "食べた"] 11 12l = [a, b, c] 13 14for i, sent in enumerate(l): 15 s = "/".join(sent) 16 for key, val in rule.items(): 17 for v in val: 18 v = "/".join(v) 19 if v in s: 20 s = s.replace(v, key) 21 l[i] = s.split("/") 22 23print(l) 24 25 26# 結果 27# [['STUDENT', 'が', 'FRUIT_EAT'], 28# ['TEACHERS', 'は', 'FRUIT_EAT'], 29# ['TEACHER', 'と', 'STUDENTS', 'は', 'ブドウ', 'を', '食べた']]
辞書ruleのキーがカテゴリ名,値が置換対象のリストです.
このruleに基づいて,置換元のリスト(a, b, c)の要素に対して,順番通り一致したら,その箇所をカテゴリ名に置換するといった動作をしています.
上記のコードで一応やりたいことはできましたが,ネストが深くなってしまっているため,もう少し簡潔に記述したいと考えています.
よろしくお願いします.
試したこと
以下のように,リスト内包表記も試してみましたが,"="のような代入式が使えないため,リストの要素の置換が上手くできませんでした(使い方が悪いだけかもしれませんが...).
Python3
1for i, sent in enumerate(l): 2 s = "/".join(sent) 3 print([[s.replace("/".join(v), key) for v in val if "/".join(v) in s] for key, val in rule.items()]) 4 5 6# 結果 7# [['STUDENT/が/リンゴ/を/食べた'], [], [], [], ['生徒/が/FRUIT_EAT']] 8# [[], [], ['TEACHER/たち/は/ミカン/を/食べた'], [], ['教師/たち/は/FRUIT_EAT']] 9# [['教員/と/STUDENT/ら/は/ブドウ/を/食べた'], [], ['TEACHER/と/学生/ら/は/ブドウ/を/食べた'], [], []]
回答1件
あなたの回答
tips
プレビュー