如何指定具有重复值的词典列表?

时间:2019-05-03 14:10:30

标签: python dictionary nested

我将数据分为3列,第1列和第2列的值重复。我想制作一个嵌套的字典,其中第1列对应于key1,第2列对应于key 2,第3列对应于值:my_dict [column1] [column2] = column [3](类似于在Excel中按2级对矩阵进行排序) 。但是我不知道如何在第二级处理密钥错误。

我的文件名如下:

string_1    val_1    2
string_1    val_2    4
string_2    val_1    3
string_2    val_1    2
string_2    val_1    2
string_3    val_3    1
string_3    val_2    2
for line in infile:
    line = line.rstrip('\n')
    col = line.split('\t')
    try:
        filt_dic[col[1]] = {}
        filt_dic[col[1]][col[2]].append(col[3])
    except KeyError:
        filt_dic[col[1]] = {}
        filt_dic[col[1]][col[3]] = [col[3]]

实际上,它只是将最后一个值附加在第二级中,我不知道如何指定它是词典列表。这是不正确的:

filt_dict[col[1]].appen({})
or
filt_dict[col[1]] = [{}]

我知道哪个是错误,但不知道如何解决,一些建议?

1 个答案:

答案 0 :(得分:2)

使用defaultdict

,我能够达到您想要的目标
from collections import defaultdict

#Use a defaultdict of dictionaries
filt_dic = defaultdict(dict)

with open('file.txt') as infile:
    for line in infile:
        line = line.rstrip('\n')
        #Split on whitespace
        col = line.split()

        #Set default value for filt_dic[col[0]] and append col[2]
        filt_dic[col[0]].setdefault(col[1],[])
        filt_dic[col[0]][col[1]].append(col[2])

print(dict(filt_dic))

所以,如果文件看起来像

string_1    val_1   2
string_1    val_2   4
string_2    val_1   3
string_2    val_1   2
string_2    val_1   2
string_3    val_3   1
string_3    val_2   2

我的输出将是

{
'string_1': {'val_1': ['2'], 'val_2': ['4']},
'string_2': {'val_1': ['3', '2', '2']},
'string_3': {'val_3': ['1'], 'val_2': ['2']}
}

请注意,字典中第3层的列表有时包含多个元素,因为key1和key2在某些行上是相同的!