您可以使用正则表达式查找“N”模式的行号,然后使用这些行号对文件进行切片:
import re
n_pat = re.compile(r'N\d')
N_matches = []
with open(sample, 'r') as f:
for num, line in enumerate(f):
if re.match(n_pat, line):
N_matches.append((num, re.match(n_pat, line).group()))
>>> N_matches
[(0, 'N1'), (12, 'N2'), (24, 'N3')]
在找出这些模式出现的行号之后,您可以使用itertools.islice
将文件分解为列表列表:
import itertools
first = N_matches[0][0]
final = N_matches[-1][0]
step = N_matches[1][0]
data_set = []
locallist = []
while first < final + step:
with open(file, 'r') as f:
for item in itertools.islice(f, first, first+step):
if item.strip():
locallist.append(item.strip())
dataset.append(locallist)
locallist = []
first += step
itertools.islice
是一种非常好的方式来获取可迭代的一部分。以下是上述示例的结果:
>>> dataset
[['N1 1.023 2.11 3.789', 'Cl1 3.126 2.6534 1.878', 'Cl2 3.124 2.4534 1.678', 'Cl3 3.924 2.1134 1.1278', 'Cl4', 'Cl5'], ['N2', 'Cl6 3.126 2.6534 1.878', 'Cl7 3.124 2.4534 1.678', 'Cl8 3.924 2.1134 1.1278', 'Cl9', 'Cl10'], ['N3', 'Cl11', 'Cl12', 'Cl13', 'Cl14', 'Cl15']]
在那之后,我对你想要做什么有点模糊,但我认为你想要数据集的每个子列表的排列?如果是这样,您可以使用itertools.permutations
在数据集的各种子列表上查找排列:
for item in itertools.permutations(dataset[0]):
print(item)
etc.
最后注:
假设我正确理解您在做什么,那么排列的数量将会很大。您可以通过对项目数进行阶乘来计算它们有多少排列。任何超过 10(10!)的东西都会产生超过 3,000,000 百万个排列。