0

次のようなファイルがあります。

1 a  
1 a  
1 b  
3 s  
3 p  
3 s  
3 y  
5 b  
...  

キーが列0で値が列1の辞書にしています。ループを使用しているので、キーを再度見ると、新しい値が既存のキーにない場合は新しい値を追加します。私の辞書は次のようになります。

test_dict = {'1': [1,b], '3': [s,p,y]...}

私のコードは次のようになります:

test_dict = {}  
with open('file.txt') as f:  
        for line in f:  
                column = line.split()  
                if column[0] not in test_dict:  
                        test_dict[column[0]] = column[3]  
                elif column[3] not in test_dict[column[0]]:  
                        test_dict[column[0]].append(column[3])  
                else:  
                        break  

そして、私はstr has no attribute append error追加行を取得しています。列が文字列として扱われることはわかっていますが、コードでこれを修正するにはどうすればよいですか?

4

3 に答える 3

3

文字列に追加することはできません。+=リストの要素を作成するか、作成しますtest_dict。また、dict値をsetsにして、重複チェックをすべて一緒に取り除くこともできますが、リストは最初の出現順序でソートされなくなります。

from collections import defaultdict

test_dict = defaultdict(set)
with open('file.txt') as f:
    for line in f:
        columns = line.split()
        test_dict[columns[0]].add(columns[3])
于 2012-12-11T16:19:03.710 に答える
1

column[3]文字列であり、文字列にtest_dict[column[0]]なります。リストにするつもりでしたか?

test_dict[column[0]] = [column[3]]
于 2012-12-11T16:19:02.263 に答える
0

groupbyの後にsetを使用して重複を削除すると、同様の結果が得られます。

>>> from itertools import groupby
>>> from operator import itemgetter
>>> {k: list(set(e for _,e in v))
        for k,v in groupby((e.split() for e in foo),
               key = itemgetter(0))}
{'1': ['a', 'b'], '3': ['y', 'p', 's'], '5': ['b']}
于 2012-12-11T18:24:07.637 に答える