2016-11-07 1 views
0

키로 그룹 값에 시도 :파일을 통해 반복하고 나는 다음과 같은 텍스트 파일을

1 cdcdm 
1 dhsajdhsa 
2 ffdm 
2 mdff 
3 ccdfm 
3 cdmfc 
3 fmdcc 

출력은 다음과 같이하는 내 목표는 : 내가 쓴

1 : cdcdm, dhsajdhsa 
2 : ffdm, mdff 
3 : ccdfm, cdmfc, fmdcc 

코드를 따르지 만, 어떤 이유로 든 예상 출력을 얻지 못합니다.

value_list = '' 
cur_key = None 
key = None 
f = open('example.txt', 'r') 
for line in f.readlines(): 
    try: 
     key, value = line.split() 
     key = key.strip() 
     value = value.strip() 
     if cur_key == key: 
      value_list = value_list + "," + value 
     else: 
      if cur_key: 
       print(cur_key + ":" +value_list) 
       cur_key = key 
       value_list = '' 
      else: 
       cur_key = key 
    except Exception as e: 
     continue 

나는 다음과 같은 출력을 받고 있어요 :

1:,dhsajdhsa 
2:,mdff 

가 어떻게 내 코드를 수정할 수 있습니다이 작업을 얻을 수 있습니까?

감사합니다,

망고

답변

2

: 그럼 당신은 당신이 완료 완성 된 사전 대응 키의 목록에 값을 추가하고, 인쇄 할 수 있습니다

1:cdcdm, dhsajdhsa 
2:ffdm, mdff 
3:ccdfm, cdmfc, fmdcc 

따라서 cur_key에 첫 번째 반복 값이 있는지 확인해야합니다. 따라서 None이 아닌 경우 설정하십시오. 또한 새 키를 찾으면 value_list을 비워두면 안됩니다. 선상에서 읽은 값으로 설정해야하므로 선취권을 건너 뛰지 않습니다. 또한 마지막 그룹 행을 잡으려면 끝에있는 루프 외부에서 값을 다시 인쇄해야합니다.

1

사용 itertools.groupby :

value_list = [] 
cur_key = None 
f = open('example.txt', 'r') 

for line in f: 
    key, value = line.split() 
    key = key.strip() 
    value = value.strip() 
    if cur_key == key or cur_key is None: 
     value_list.append(value) 
    else: 
     print('{}: {}'.format(cur_key, ','.join(value_list))) 
     value_list = [value] 
    cur_key = key 

if value_list: 
    print('{}: {}'.format(cur_key, ','.join(value_list))) 
+0

기존 코드를 수정하여이를 수행 할 수있는 방법이 있습니까? 나는 그것을 특정한 방법으로 해결하려고 노력하고있다. – mangodreamz

0

나는 그것을 날리하고 collections.defaultdict를 사용하는 것이 좋습니다 :

import itertools 

with open('example.txt') as f: 
    for key, strings in itertools.groupby(f, lambda s: s.strip()[0]): 
     print('{}: {}'.format(
      key, ', '.join(s.split(None, 1)[1].strip() for s in strings))) 

는 여기에 귀하의 코드를 기반으로 대답. 최소한의 변경 구현이

with open('example.txt', 'r') as f: 
    cur_key = None 
    value_list = [] 
    for line in f.readlines(): 

     key, value = line.split() 
     value = value.strip() 

     if not cur_key: 
      cur_key = key 

     if cur_key == key:  
      value_list.append(value) 
     else: 
      print(cur_key + ":" + ', '.join(value_list)) 
      cur_key = key 
      value_list = [value] 
    print(cur_key + ":" +', '.join(value_list)) 

출력처럼 보일 수 있습니다

import collections 

d = collections.defaultdict(list) 

with open('example.txt') as f: 
    for line in f: 
     k,v = line.split() 
     d[k].append(v.strip()) 

for k,v in sorted(d.items()): 
    print('{} : {}'.format(k, ', '.join(v))) 
+0

솔루션에 상태 비 저장을 원합니다. 사전 전체를 기억하지 않고 그것을 해결할 수있는 방법이 있습니까? – mangodreamz

+0

@mangodreamz : 그게'groupby' 대답입니다. – ShadowRanger

0

나는 또한 더 좋은 방법이 있다고 믿지만 실제로 기본을 고수하고 싶다면 최소한 텍스트를 연결하는 대신 목록을 사용하십시오. 다음은 코드의 다른 버전입니다. 약간의 변경 사항이 있습니다.

lists = [] 
cur_key = None 
key = None 
f = open('example.txt', 'r') 
for line in f.readlines(): 
    try: 
     key, value = line.split() 
     key = key.strip() 
     value = value.strip() 
     if cur_key != key: 
      if(cur_key): 
       lists.append(value_list) 
      value_list = [] 
      cur_key = key 
     value_list.append(value) 
    except Exception as e: 
     continue 
lists.append(value_list) 

for i,l in enumerate(lists): 
    print(str(i+1) + ' : ' + ', '.join(l)) 
관련 문제