0

我有一个看起来像这样的文件

N1 1.023 2.11 3.789 

Cl1 3.124 2.4534 1.678

Cl2 # # #

Cl3 # # #

Cl4

Cl5

N2

Cl6

Cl7

Cl8

Cl9

Cl10

N3

Cl11


Cl12

Cl13

Cl14

Cl15

这三个数字自始至终都在下降。

我想做的几乎是一个排列。这是 3 个数据集,第 1 组是 N1-Cl5,第 2 组是 N2-Cl10,第 3 组是 N3 - end。

我想要 N 和 Cl 的每种组合。例如,第一个输出是

Cl1

N1

Cl2

然后其他一切都一样。下一组将是 Cl1、Cl2、N1、Cl3……等等。

我有一些代码,但它不会做我想要的,因为它会知道有三个单独的数据集。我是否应该将三个数据集放在三个不同的文件中,然后使用如下代码进行组合:

list1 = ['Cl1','Cl2','Cl3','Cl4', 'Cl5']

for line in file1:
    line.replace('N1', list1(0))
    list1.pop(0)
    print >> file.txt, line,

或者,还有更好的方法??提前致谢

4

2 回答 2

0

您可以使用正则表达式查找“​​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 百万个排列。

于 2013-07-25T22:16:59.763 回答
0

这应该可以解决问题:

from itertools import permutations

def print_permutations(in_file):
    separators = ['N1', 'N2', 'N3']
    cur_separator = None
    related_elements = []

    with open(in_file, 'rb') as f:
        for line in f:
            line = line.strip()

            # Split Nx and CIx from numbers.
            value = line.split()[0]

            # Found new Nx. Print previous permutations.
            if value in separators and related_elements:
                for perm in permutations([cur_separator] + related_elements)
                    print perm
                cur_separator = line
                related_elements = []
            else:
                # Found new CIx. Append to the list.
                related_elements.append(value)
于 2013-07-25T20:44:41.283 回答