需要将提取列表中的某些值合并到子列表中

Need to merge together certain values within extracted list into sublists

我正在从文件中提取这段文本以转换成字典:

ACC210:
Luther, Martin
Spurgeon, Charles

CS121P:
Bunyan, John
Henry, Matthew
Luther, Martin

CS132S:
Calvin, John
Knox, John
Owen, John

这是我用来打开它并创建两个列表的代码,因此我可以使用它们来创建字典:

with open("classes.txt") as file:
    data = [line.strip() for line in file]
    a = []
    b = []
    for x in data:
        if ':' in x:
            a.append(x)
        else:
            b.append(x)

列表显示为

['ACC210:', 'CS121P:', 'CS132S:']
['Luther, Martin', 'Spurgeon, Charles', '', 'Bunyan, John', 'Henry, Matthew', 'Luther, Martin', '', 'Calvin, John', 'Knox, John', 'Owen, John', '']

但是我需要第二个列表如下所示:

[['Luther, Martin', 'Spurgeon, Charles'],['Bunyan, John', 'Henry, Matthew','Luther, Martin'], ['Calvin, John', 'Knox, John', 'Owen, John']]

我该怎么做?

您可以尝试以下方法:

lst1, lst2 = [], []
with open('input.txt', 'r') as f:
    for line in map(lambda x: x.rstrip('\n'), f):
        if ':' in line:
            lst1.append(line)
            lst2.append(names := [])
        elif line:
            names.append(line)

print(lst1) # ['ACC210:', 'CS121P:', 'CS132S:']
print(lst2)
# [['Luther, Martin', 'Spurgeon, Charles'], ['Bunyan, John', 'Henry, Matthew', 'Luther, Martin'], ['Calvin, John', 'Knox, John', 'Owen, John']]

lst2.append(names := []) 行需要 python 3.8+。如果该行不适合您,请使用:

names = []
lst2.append(names)

如果你想听写,你可以这样做:

import re 

di={}
with open(fn) as f:
    for k,v in re.findall(r'(^.*):([\s\S]*?)(?=^$|\Z)', f.read(), flags=re.M):
        di[k]=v.strip().splitlines()

>>> di
{'ACC210': ['Luther, Martin', 'Spurgeon, Charles'], 'CS121P': ['Bunyan, John', 'Henry, Matthew', 'Luther, Martin'], 'CS132S': ['Calvin, John', 'Knox, John', 'Owen, John']}

如果你想要两个列表:

import re 

a,b=[],[]
with open(fn) as f:
    for k,v in re.findall(r'(^.*):([\s\S]*?)(?=^$|\Z)', f.read(), flags=re.M):
        a.append(k)
        b.append(v.strip().splitlines())

>>> a
['ACC210', 'CS121P', 'CS132S']
>>> b
[['Luther, Martin', 'Spurgeon, Charles'], ['Bunyan, John', 'Henry, Matthew', 'Luther, Martin'], ['Calvin, John', 'Knox, John', 'Owen, John']]

您也可以不使用正则表达式来执行此操作:

a,b=[],[]
with open(fn) as f:
    for k, sl in ((sl[0], sl[1:]) 
        for sl in (e.splitlines() 
            for e in f.read().rstrip().split('\n\n'))):
        a.append(k.rstrip(':'))
        b.append(sl)

# same a,b

同样的方法你可以直接创建一个字典:

with open(fn) as f:
    di={sl[0]:sl[1:] for sl in (e.splitlines() 
            for e in f.read().rstrip().split('\n\n'))}

>>> di
{'ACC210:': ['Luther, Martin', 'Spurgeon, Charles'], 'CS121P:': ['Bunyan, John', 'Henry, Matthew', 'Luther, Martin'], 'CS132S:': ['Calvin, John', 'Knox, John', 'Owen, John']}