lis中的分组元素

2024-06-16 14:09:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在一个列表中对元素进行分组-每个组都有一个定义的开始和结束:

data = ['§349', 'Abs.', '2', '4', 'StPO', '1', '3', '42', '§306a', 'Abs.', '1', 'Nr.', '1', 'StGB', '§306b', 'Abs.', '2', 'Nr.', '2', 'StGB', '§306b', 'Abs.', '2', 'Nr.', '2', 'StGB', '§306a', '§306b', 'Abs.', '2', 'Nr.', '2', 'StGB', '2', '3', '4', '5', '4', '§306a', 'Abs.', '1', 'Nr.', '1', 'StGB', '10', '16', '26', '2', 'StR', '76', '§306a', 'Abs.', '1', 'Nr.', '1', 'StGB', '2', 'StR', '2', 'StR', '76', 'StGB', '§306a', '§306a', '§306a', '§306', 'Abs.', '1', 'Nr.', '1', 'StGB']

所需输出=['§349|Abs.2|4|StPO', '§306a|Abs.1|Nr.1|StGB', '§306b|Abs.2|Nr.2|StGB', '§306b|Abs.2|Nr.2|StGB', (...)]

开始:"§"

结束:"StPO""StGB"

列表中的每个元素应首先以符号“§”开始,然后以“StGB”或“StPO”结束。如果在StPO或StGB之后,下一个元素没有以§开头,那么删除它们直到到达§。每个元素都应该用“|”连接起来,但如果元素是“Abs.”或“Nr.”则不能这样-在这种情况下,下一个元素应该在没有分隔符的情况下连接起来。你知道吗


Tags: 元素列表data定义符号情况absnr
3条回答

希望这能有所帮助

def t(data):
    start = []
    end, e = [], True 
    rs = []  
    for i,n in enumerate(data):
        if n.startswith('§'):
            if e:
                start.append(i)
                e = False
        elif n.startswith('St'):
            end.append(i)
            e = True 
    for v in range(len(start)):
        k,l=start[v], end[v]
        d = '|'.join(data[k:l+1]).replace('Abs.|', 'Abs.').replace('Nr.|', 'Nr.')
        if d:
            rs.append(d)

rs = t(data)
print(rs)

另一种方法是使用regex和replacement:

import re

data = ['§349', 'Abs.', '2', '4', 'StPO', '1', '3', '42', '§306a', 'Abs.', '1', 'Nr.', '1', 'StGB', '§306b', 'Abs.', '2', 'Nr.', '2', 'StGB', '§306b', 'Abs.', '2', 'Nr.', '2', 'StGB', '§306a', '§306b', 'Abs.', '2', 'Nr.', '2', 'StGB', '2', '3', '4', '5', '4', '§306a', 'Abs.', '1', 'Nr.', '1', 'StGB', '10', '16', '26', '2', 'StR', '76', '§306a', 'Abs.', '1', 'Nr.', '1', 'StGB', '2', 'StR', '2', 'StR', '76', 'StGB', '§306a', '§306a', '§306a', '§306', 'Abs.', '1', 'Nr.', '1', 'StGB']
data_str = "|".join(data)

patt = re.compile("(§[^§]*?St(PO|GB))")

search_res = re.findall(patt, data_str)
output = [each[0].replace("Abs.|", "Abs.").replace("Nr.|", "Nr.") for each in search_res]

print(output)

输出:

[
    '§349|Abs.2|4|StPO', 
    '§306a|Abs.1|Nr.1|StGB', 
    '§306b|Abs.2|Nr.2|StGB', 
    '§306b|Abs.2|Nr.2|StGB', 
    '§306b|Abs.2|Nr.2|StGB', 
    '§306a|Abs.1|Nr.1|StGB', 
    '§306a|Abs.1|Nr.1|StGB', 
    '§306|Abs.1|Nr.1|StGB'
]

这里有一个简单的方法。在这里,只需添加额外的elif语句,以获得对字符串形成的附加约束:

out = []
f = False
for i in data:
    if i.startswith('§'):
        l = i[:]
    elif i.startswith(('StPO','StGB')):
        l += f'|{i}'
        out.append(l)
        l = ''
    elif i.startswith(('Abs.','Nr.')):
        f = True
        tmp = i[:]
    else:    
        if f:
            l += f'|{tmp}{i}'
            f = False
        else:
            l += f'|{i}'

print(out)

['§349|Abs.2|4|StPO',
 '§306a|Abs.1|Nr.1|StGB',
 '§306b|Abs.2|Nr.2|StGB',
 '§306b|Abs.2|Nr.2|StGB',
 '§306b|Abs.2|Nr.2|StGB',
 '§306a|Abs.1|Nr.1|StGB',
  ...

相关问题 更多 >