2013-07-25 6 views
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 엔드입니다.

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, 

또는 더 좋은 방법이 있습니까 ?? 이 트릭을 할해야

답변

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) 
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')] 

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을 사용할 수 있습니다

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']] 

, 나는 약간은 당신이하고자하는지에 흐릿 해요,하지만 난 당신이 데이터 세트의 각 하위 목록의 순열을 원한다고 생각?

for item in itertools.permutations(dataset[0]): 
    print(item) 
etc. 

최종 참고 : 내가 정확하게 당신이 무슨 일을하는지 이해 가정

는, 순열의 수가 될 것입니다 그렇다면, 당신은 데이터 세트의 여러 하위 목록에 순열을 찾을 itertools.permutations을 사용할 수 있습니다 거대한. 항목 수의 계승을 통해 순열 수를 계산할 수 있습니다. 10 (10!) 이상인 경우 3,000,000,000 이상의 순열을 생성합니다.