1

次のようないくつかの列を持つファイルがあります。

PAIR 1MFK 1 URANIUM 82 HELIUM 112 2.5506  
PAIR 2JGH 2 PLUTONIUM 98 POTASSIUM 88 5.3003  
PAIR 345G 3 SODIUM 23 CARBON 14 1.664  
PAIR 4IG5 4 LITHIUM 82 ARGON 99 2.5506  
PAIR 234G 5 URANIUM 99 KRYPTON 89 1.664  

ここで私がやりたかったのは、最後の列を読み取り、繰り返しの値を繰り返して、2つの列を含む出力ファイルを生成することです'VALUE' & 'NO OF TIMES REPEATED'

私は次のように試しました:

inp = ('filename'.'r').read().strip().replace('\t',' ').split('\n')
from collections import defaultdict
D = defaultdict(line)

for line in map(str.split,inp):
     k=line[-1]
     D[k].append(line)

私はここで立ち往生しています。
プラーズヘルプ。

4

2 に答える 2

2

投稿されたコードには多くの問題があります。リスト内包表記内でwhileループを使用することはできません。defaultdictの引数は、ではなくリストにする必要があります。コードの修正バージョンは次のとおりです。

from collections import defaultdict
D = defaultdict(list)

for line in open('filename', 'r'):
    k = line.split()[-1]
    D[k].append(line)

print 'VALUE    NO TIMES REPEATED'
print '-----    -----------------'
for value, lines in D.items():
    print '%-6s           %d'  % (value, len(lines))

これを行う別の方法は、collections.Counterを使用して、繰り返しの数を簡単に合計することです。それでは、コードを少し単純化しましょう。

from collections import Counter
D = Counter()

for line in open('filename', 'r'):
    k = line.split()[-1]
    D[k] += 1

print 'VALUE    NO TIMES REPEATED'
print '-----    -----------------'
for value, count in D.items():
    print '%-6s           %d'  % (value, count)
于 2012-05-06T05:00:51.550 に答える
0

ここで私がやりたかったのは、最後の列を読み取り、繰り返しの値を繰り返して、2つの列「VALUE」と「NOOFTIMESREPEATED」を含む出力ファイルを生成することです。

したがって、を使用collections.Counterして、ではなく、各値が表示される回数をカウントしますdefaultdict。(、で何をしようとしているのかはまったくわかりませdefaultdictん。とにかく、初期化は機能しません。defaultdictデフォルト値を作成する呼び出し可能オブジェクトで構築されています。あなたの場合、あなたが念頭に置いていたデフォルト値は空のリストなので、を初期化するために使用listしますdefaultdict。)それらを数えるために行を格納する必要はありません。自動的にCounterカウントされます。

また、ファイル全体を事前に処理するのは少し醜いです。ファイルを直接反復して行を取得できるため、処理の一部を実行します。実際には、Counter作成時にその反復を自動的に行うことができます。

完全な解決策は次のとおりです。

from collections import Counter
with open('input', 'r') as data:
    histogram = Counter(line.split('\t')[-1].strip() for line in data)
with open('output', 'w') as result:
    for item in histogram.iteritems():
        result.write('%s\t%s\n' % item)
于 2012-05-06T05:00:12.383 に答える