Pythonリファレンスへの@delnanのリンクは良いアプローチを提供しますが、(リファレンス自体が示唆するように)Pythonは正しいインデントを可能にします。
アプリケーションでは、異なるリスト レベルを示すためにインデント スペースの一意の数が必要な場合、ユーザーの混乱が少なくなる可能性があります。これらのセマンティクスについては、Python 3 のわずか 4 行でリストのレベルを見つけることができます。コードで解決策を見たいとは思わなかったでしょう (ただし、必要に応じて投稿したいと思います)。私のアプローチはおおよそ次のとおりでした:
- リストの各行の先頭にあるスペースの数を数えます (正規表現は必要ありません)。
- セットを作成し、それを並べ替えて、このリストの各レベルで使用されるインデント スペースの数のリストを最小から最大の順に並べます。
- それぞれのケースで使用されるインデント スペースの数をリスト レベルに関連付ける辞書を作成します。
- リストの各行の先頭にあるスペースの数を使用してその辞書を参照します。これにより、各行のリスト レベルが得られます。
(コードを含め、複数行のリスト項目を処理するために編集)
与えられた:
:: List item
(this is the second line of the first list item)
:: List item level 2
:: List item level 2
:: List item level 3
:: List item level 4
:: List item level 2
:: List item top leve
... 以下の関数はリストを生成します:
:: List item (this is the second line of the first list item)
:: List item level 2
:: List item level 2
:: List item level 3
:: List item level 4
:: List item level 2
:: List item top level
... これは、このテスト ケースの意図した結果だと思います。
標準入力からリストを受け入れるように書かれたコードは次のとおりです。
import sys
def findIndent (lst):
# given a list of text strings, returns a list containing the
# indentation levels for each string
spcCount = [len(s)-len(s.lstrip(' ')) for s in lst]
indent = sorted(set(spcCount))
levelRef = {indent[i]:i for i in range(len(indent))}
return [levelRef[i]+1 for i in spcCount]
lst = []
for li in sys.stdin:
if li.lstrip(' ').find('::') == 0:
lst.append(li.rstrip())
else:
lst[-1] = lst[-1].rstrip() + ' ' + li.lstrip(' ').rstrip()
for i,li in zip(findIndent(lst),lst):
print (' '*i + li.lstrip())