2016-11-07 9 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

最小限の変更実装がこの

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

出力のようになります。

したがって、cur_keyに最初の反復の値があることを確認する必要があります。そうでない場合はNoneに設定してください。また、新しい鍵が見つかった場合は、value_listを空白にリセットしないでください。これは、その行で読み取られた値に設定する必要があるため、先取特権はスキップされません。また、最後のグループ行をキャッチするには、最後にループ外に値を再度出力する必要があります。

1

使用itertools.groupby

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

ここにあなたのコードに基づいて回答です:

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 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)) 
関連する問題