1

辞書付きの見出し行を持つ 2 列 (色 number_of_occurances) の .tsv ファイルを分析しようとしています。可能な最も一般的な方法で見出し行をスキップしようとしています (これは、2 番目の列を int 型にする必要があると仮定します)。以下は私が思いついた最高のものですが、もっと良いものがあるようです:

filelist = []
color_dict = {}
with open('file1.tsv') as F:
    filelist = [line.strip('\n').split('\t') for line in F]
for item in filelist:
    try: #attempt to add values to existing dictionary entry
        x = color_dict[item[0]]
        x += int(item[1])
        color_dict[item[0]] = x
    except: #if color has not been observed yet (KeyError), or if non-convertable string(ValueError) create new entry
        try:
            color_dict[item[0]] = int(item[1])
        except(ValueError): #if item[1] can't convert to int
            pass

試行と例外を処理するためのより良い方法があるはずです。

リクエストによるファイルの抜粋:

color Observed
green 15
gold 20
green 35

4

2 に答える 2

4

[1:]次のようにリストをスライスして、リストの最初の要素をスキップすることはできません。

filelist = [line.strip('\n').split('\t') for line in F][1:]

これで、fileList最初の行の要素、つまり見出し行はまったく含まれなくなります。

または、@ StevenRumbalskiのコメントで指摘されているように、リスト内包next(F, None)表記の前に、次のような最初の要素の後にリストのコピーを作成しないようにすることができます。

with open('file1.tsv') as F:
    next(F, None)
    filelist = [line.strip('\n').split('\t') for line in F]

また、ここを使用するとよいでしょうdefaultdict

次のように使用します。

from collections import defaultdict
color_dict = defaultdict(int)

このように、操作する前に、の存在を確認する必要はありませんkey。だから、あなたは簡単に行うことができます:

color_dict[item[0]] += int(item[1])
于 2013-02-14T20:52:55.333 に答える
2

defaultdictこの場合に使用します。なぜなら、各キーが初めて検出されたとき、それはまだマッピングに含まれていないからです。したがって、エントリは自動的に作成されます。

 from collections import defaultdict
 color_dict = defaultdict(int)
 for item in filelist:
       color_dict[item[0]] += int(item[1])
于 2013-02-14T20:56:39.580 に答える