2012-03-16 20 views
1

私は現在、私のファイル内のすべての行が1行に表示されるように順序は、このファイルである私がやりたい何Pythonのグループは、同様のライン

file.txt 

vfc1 3435 4556 
vfc1 2334 2123 
vfc1 5556 1234 
vfc2 8997 5969 
vfc2 4543 3343 
vfc2 1232 2123 

非常に順不同でファイルを持っています

file_output.txt 
vfc1 1234 2123 2334 3435 4556 5556 
vfc2 1232 2123 3343 4543 5969 8997 
+2

これを刺してください。辞書を使う。 – Blender

+0

あなたの例では、すべての 'vfc1'はすべての' vfc2'sの前にあります。 – bereal

+0

@Blender私はそれを刺した。辞書を使って、結果はひどかった。また、前に辞書で遊んだことがありません –

答えて

2

これはいかがですか?

from collections import defaultdict 

d = defaultdict(list) 
with open('input.txt') as f: 
    for line in f.readlines(): 
     data = line.split() 
     d[data[0]].extend(data[1:]) 

with open('output.txt', 'w') as f: 
    for key, value in d.iteritems(): 
     f.write(
      '%(key)s %(value)s\n' 
      % {'key': key, 'value': " ".join(sorted(value))} 
     ) 
+0

これは本当にうまくいく、感謝のヒープ。 –

0

Python固有ではありません。擬似コードのようなよりますが、ここでアイデアです:

  • は、アレイ内のすべての行を取得
  • は「最後のエントリ」アレイ
  • 設定し、現在のインデックスを決定するために、グローバルなVARを設定し、ターゲット配列
  • に設定してください
    • 分割された配列に区切りとして' '(スペース)を使用して、文字列、parts
    • はアレイを通して見ます
    • parts[0]です== currentIndex?はいの場合はparts[1],parts[2]lastEntryに追加してください。
    • そうでない場合は、lastEntrytargetArrayを追加してください。 currentIndex = parts[0]を設定します。クリアlastEntryparts[1],parts[2]lastEntryに追加します。

それだけです! :-)

0
my_file = open('file.txt', 'r') 

lines = {} 

for line in my_file: 
    values = line.split() 
    lines[values[0]] = lines.get(values[0], []) + values[1:] 

my_file.close() 
new_file = open('output_file.txt', 'w') 

for k in lines: 
    line = '%s %s\n' % (k, ' '.join(sorted(lines[k]))) 
    new_file.write(line) 

new_file.close() 
+0

このコードでエラーが発生します。それは言う: TypeError:values()は引数を取らない(2与えられる) –

1

たぶん、このような何か:

d = {} 

for line in file('file.txt'): 
     if line.strip(): 
       sl = line.split() 
       if d.has_key(sl[0]): 
         d[sl[0]] += ' %s' % ' '.join(sl[1:]) 
       else: 
         d[sl[0]] = ' '.join(sl[1:]) 

fd = open('file_output.txt', 'w') 
for key in d: 
     fd.write('%s %s\n' % (key, d[key])) 

fd.close() 
+0

この仕事はきれいに、感謝のヒープ –

0

ます。また、最初の列でグループラインへiterools.groupbyを使用することができます。

from collections import defaultdict 
from itertools import chain, groupby 

with open(input) as f: 
    data = (x.split() for x in f) 
    grouped = defaultdict(list) 
    for key, group in groupby(data, key=lambda x: x[0]): 
     for line in group: 
      grouped[key] += line[1:] 

for k,v in grouped.items(): 
    print k, ' '.join(v) 
0
>>> with open('/tmp/file1.txt') as f: 
... spam = [x.strip().split() for x in f.readlines() if x.strip()] 
... 
>>> import collections 
>>> d = collections.defaultdict(list) 
>>> for l in spam: 
... d[l[0]].extend(l[1:]) 
... 
>>> for k,v in d.iteritems(): 
... print '{} {}'.format(k, ' '.join(v)) 
... 
vfc1 3435 4556 2334 2123 5556 1234 
vfc2 8997 5969 4543 3343 1232 2123 

あなたはを通して読んでいるとき論理を理解している場合は、チャットをprintに変更して、次のように書くことができます。

>>> with open('/tmp/file_output.txt', 'w') as f: 
... for k,v in d.iteritems(): 
...  f.write('{} {}\n'.format(k, ' '.join(v)))