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 值设置set为 s 并摆脱重复检查,尽管您的列表将不再按首次出现顺序排序。

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 回答