Как указать список словарей с дублированными значениями? - PullRequest
0 голосов
/ 03 мая 2019

Мои данные разделены на 3 столбца, столбцы 1 и 2 имеют дублированные значения. Я хочу создать вложенный словарь, в котором столбец 1 соответствует ключу 1, столбец 2 - ключу 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 Ответ

2 голосов
/ 03 мая 2019

Я смог достичь чего-то близкого к тому, что вы искали, используя 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-м уровне в dict иногда содержат более одного элемента, поскольку key1 и key2 одинаковы для некоторых строк!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...