2009-07-06 2 views
1

내가 4 개 필드파이썬은

aaaa bbb1 cccc dddd 
aaaa bbb2 cccc dddd 
aaaa bbb3 cccc eeee 
aaaa bbb4 cccc ffff 
aaaa bbb5 cccc gggg 
aaaa bbb6 cccc dddd  

나와 함께하시기 바랍니다 곰의 포함하는 데이터 라인이 분야에서 공통 값이 모든 행을 제거합니다.

첫 번째와 세 번째 필드는 항상 동일하지만 필자는 필요하지 않습니다. 네 번째 필드는 같거나 다를 수 있습니다. 문제는 공통 필드를 공유하지 않는 라인의 두 번째 및 네 번째 필드 만 원한다는 것입니다. 그의 항목 중 하나를 떠날 것처럼 위의 데이터에서이 같은 예를 들어 나는 중복 제거를 의미하지 않는다

이제
bbb3 eeee 
bbb4 ffff  
bbb5 gggg  

. 다른 라인 값이, 내가 어떤 라인을 원하지 않는 4 필드를 공유하는 경우 그것은 그 가치를 가지고있었습니다.

아마도 단순한 질문에 다시 한번 사과하십시오. 여기

답변

6

당신이 이동 : 당신의 증폭 요구 사항에 대한

from collections import defaultdict 

LINES = """\ 
aaaa bbb1 cccc dddd 
aaaa bbb2 cccc dddd 
aaaa bbb3 cccc eeee 
aaaa bbb4 cccc ffff 
aaaa bbb5 cccc gggg 
aaaa bbb6 cccc dddd""".split('\n') 

# Count how many lines each unique value of the fourth field appears in. 
d_counts = defaultdict(int) 
for line in LINES: 
    a, b, c, d = line.split() 
    d_counts[d] += 1 

# Print only those lines with a unique value for the fourth field. 
for line in LINES: 
    a, b, c, d = line.split() 
    if d_counts[d] == 1: 
     print b, d 

# Prints 
# bbb3 eeee 
# bbb4 ffff 
# bbb5 gggg 
+0

. 많은 감사합니다. 이제 필자의 스크립트에 짜 넣어야합니다. 필자는 파일을 반복하고, 나중에 스크립트를 통해 출력물을 사용할 수있게합니다. 어떤 문제를 생각하니? –

+0

당신이주의해야 할 유일한 것은 내가 두 번 반복하는 것입니다. 두 줄의 "for line in LINES :"대신에 "my_open_file : for for line"이라는 두 줄을 단순히 대체 할 수는 없습니다. 첫 번째 루프는 전체 파일을 읽고 두 번째 루프는 읽지 않습니다. 두 번째 루프를 사용할 라인 목록을 저장하거나 두 번째 루프 전에 파일의 시작 부분으로 seek()합니다. – RichieHindle

0

, 당신은 두 번 파일을 읽거나 목록에 저장 방지 할 수 있습니다

에 대한 완벽
LINES = """\ 
aaaa bbb1 cccc dddd 
aaaa bbb2 cccc dddd 
aaaa bbb3 cccc eeee 
aaaa bbb4 cccc ffff 
aaaa bbb5 cccc gggg 
aaaa bbb6 cccc dddd""".split('\n') 

import collections 
adict = collections.defaultdict(list) 
for line in LINES: # or file ... 
    a, b, c, d = line.split() 
    adict[d].append(b) 

map_b_to_d = dict((blist[0], d) for d, blist in adict.items() if len(blist) == 1) 
print(map_b_to_d) 

# alternative; saves some memory 

xdict = {} 
duplicated = object() 
for line in LINES: # or file ... 
    a, b, c, d = line.split() 
    xdict[d] = duplicated if d in xdict else b 

map_b_to_d2 = dict((b, d) for d, b in xdict.items() if b is not duplicated) 
print(map_b_to_d2)