python打印指定行数的分割线_如何通过缩进在分割线中打印行?

本文介绍了一种通过计算文本缩进来分割字符串的方法。利用Python的defaultdict存储不同缩进级别的行索引,进而找出最小缩进级别的行索引,最后根据这些索引将原文本分割成多个段落。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我有字符串:

text = '''TextTextTextTextTextTextTextTextText1

TextTextTextTextTextTextTextTextText1

TextTextTextTextTextTextTextTextText2

TextTextTextTextTextTextTextTextText2

TextTextTextTextTextTextTextTextText2

TextTextTextTextTextTextTextTextText2

TextTextTextTextTextTextTextTextText2

TextTextTextTextTextTextTextTextText3

TextTextTextTextTextTextTextTextText3

TextTextTextTextTextTextTextTextText3

TextTextTextTextTextTextTextTextText4

TextTextTextTextTextTextTextTextText4

TextTextTextTextTextTextTextTextText4'''

我想通过缩进分割该字符串并将其添加到列表中。这是我当前的代码:

nr_lines = 0

indent_dict = {}

for line in summary1.splitlines(True):

print(line)

print("------------------------------")

nr_lines+=1

whitespaces_count = len(line) - len(line.lstrip())

indent_dict[nr_lines] = whitespaces_count

print(indent_dict)

list_of_values = []

# Removed first key with value (indent) = 0

indent_dict_without = dict(indent_dict)

key = 1

del indent_dict_without[key]

# Adding values from dict to list

for key, value in indent_dict_without.items():

list_of_values.append(value)

print(list_of_values)

# Finding minimum value

x = min(list_of_values)

list_of_small = []

for nr in list_of_values:

if nr == x:

list_of_small.append(nr)

print(list_of_small)

# Finding which line have all smallest indent

n = 0

key_1 = []

for key, value in indent_dict.items():

if value == list_of_small[n]:

key_1.append(key)

print(key_1)

输出为:

{1: 0, 2: 12, 3: 8, 4: 12, 5: 12, 6: 12, 7: 12, 8: 8, 9: 12, 10: 12, 11: 8, 12: 12, 13: 12} # dict with line and value (indent)

[12, 8, 12, 12, 12, 12, 8, 12, 12, 8, 12, 12] # list with indents

[8, 8, 8] # the smallest indents

[3, 8, 11] # lines for smallest indents

现在,我不知道如何拆分并添加这4个部分作为list元素:

list = ['TextTextTextTextTextTextTextTextText1

TextTextTextTextTextTextTextTextText1',

'TextTextTextTextTextTextTextTextText2

TextTextTextTextTextTextTextTextText2

TextTextTextTextTextTextTextTextText2

TextTextTextTextTextTextTextTextText2

TextTextTextTextTextTextTextTextText2',

'TextTextTextTextTextTextTextTextText3

TextTextTextTextTextTextTextTextText3

TextTextTextTextTextTextTextTextText3',

'TextTextTextTextTextTextTextTextText4

TextTextTextTextTextTextTextTextText4

TextTextTextTextTextTextTextTextText4']

我是否应该创建一个新变量并逐行添加行,直到新缩进?

解决方案

如果我对您的理解正确,则希望根据缩进最小的行将段落中的文本拆分。

我处理此问题的方法如下。我将创建一个defaultdict,将组成缩进的空格数作为关键字,并将包含该缩进的行的所有索引的值作为列表:

from collections import defaultdict

text = '''TextTextTextTextTextTextTextTextText1

TextTextTextTextTextTextTextTextText1

TextTextTextTextTextTextTextTextText2

TextTextTextTextTextTextTextTextText2

TextTextTextTextTextTextTextTextText2

TextTextTextTextTextTextTextTextText2

TextTextTextTextTextTextTextTextText2

TextTextTextTextTextTextTextTextText3

TextTextTextTextTextTextTextTextText3

TextTextTextTextTextTextTextTextText3

TextTextTextTextTextTextTextTextText4

TextTextTextTextTextTextTextTextText4

TextTextTextTextTextTextTextTextText4'''

def count_indentation(line):

return len(line) - len(line.lstrip())

lines = text.splitlines(keepends=False)

indent_dict = defaultdict(list)

for idx, line in enumerate(lines):

if count_indentation(line) > 0:

indent_dict[count_indentation(line)].append(idx)

现在indent_dict看起来像:

defaultdict(list, {8: [1, 3, 4, 5, 6, 8, 9, 11, 12], 4: [2, 7, 10]})

接下来,我们用最小的键来找到相关行的索引:

smallest_indent = min(indent_dict)

line_idexes_smallest_indents = indent_dict[smallest_indent]

的结果line_idexes_smallest_indents是[2, 7, 10]。索引从零开始,这就是为什么我的索引都比您的结果少一的原因。现在,我们需要根据这些索引对原始文本进行分区。

def partition(lines, indices):

return [''.join(lines[i:j]) for i, j in zip([0]+indices, indices+[None])]

partition(lines, line_idexes_smallest_indents)

结果:

['TextTextTextTextTextTextTextTextText1 TextTextTextTextTextTextTextTextText1',

' TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2 TextTextTextTextTextTextTextTextText2',

' TextTextTextTextTextTextTextTextText3 TextTextTextTextTextTextTextTextText3 TextTextTextTextTextTextTextTextText3',

' TextTextTextTextTextTextTextTextText4 TextTextTextTextTextTextTextTextText4 TextTextTextTextTextTextTextTextText4']

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值