需要将提取列表中的某些值合并到子列表中
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']}
我正在从文件中提取这段文本以转换成字典:
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']}