我将数据分为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]] = [{}]
我知道哪个是错误,但不知道如何解决,一些建议?
答案 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在某些行上是相同的!