@delnan 到Python 参考的链接提供了一种很好的方法,但是(正如参考本身所暗示的)Python 允许正确的缩进,这也使阅读感到困惑,并且(如果您尝试利用它的全部自由性)可能难以调试。
对于您的应用程序,如果您需要每个唯一数量的缩进空格来指示不同的列表级别,则可能不会让用户感到困惑。对于这些语义,您可以在不超过四行 Python 3 中找到列表的级别。您不想在代码中看到解决方案(尽管如果您愿意,我很乐意发布)所以我的做法大致如下:
- 计算列表每行开头的空格数(不需要正则表达式)。
- 创建一个集合并对其进行排序以给出用于该列表的每个级别的缩进空格数的列表,从最少到最多排序。
- 创建一个字典,将每种情况下使用的缩进空格数与列表级别相关联。
- 使用列表每行开头的空格数来引用该字典,这给出了每行的列表级别。
(已编辑以包含代码并处理多行列表项)
鉴于:
:: 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())