Словарь Python один ключ с несколькими значениями возможно? - PullRequest
2 голосов
/ 22 марта 2019

У меня проблема со словарем для одного ключа, но нескольких значений.Я собираю некоторые данные из таблицы базы данных sqlite3 (bacnet_props), имеющей 3 столбца.1-й столбец содержит 6 записей, каждая из которых имеет одинаковый ключ (например, object_id [81]).Object_ids: 80,81,82,112,113,114.2-й столбец имеет 6 записей, каждая из которых имеет свой prop_id, поэтому 6 разных значений (2501-2510), а затем 3-й столбец имеет 6 разных записей, каждая из которых имеет другое значение, поэтому снова 6 разных значений (целое число / строка).Теперь я пытаюсь собрать эти значения во 2-м и 3-м столбцах, вызвав object_id в 1-м столбце и сделав сравнение с моими ожидаемыми значениями для проверки.Я пытаюсь использовать следующий код, который просто дает мне записи с ключом один раз, означающим 1 из 6 записей из всех этих 3 столбцов.Ребята, можете ли вы помочь мне решить эту проблему?

db_cursor = conn.execute("SELECT * from bacnet_props")
for row in db_cursor:
    observed_output[row[0]]=row[1:3]

Вывод, который я получаю:

{80: (2510, '2'), 81: (2510, '4'), 114: (2510, '108'), 113: (2510, '105'), 
112: (2510, '103'), 82: (2510, '8')}

Вывод, который я ожидаю, будет:

enter code here
 {80: (2501, '1'), 80: (2502, '4'), 80: (2503, 'LivingRoom'), .......
  81: (2501, '2'), 81: (2502, '5'), 81: (2503, 'FreeSpace'), ........
 ....................................................................
  114: (2501, '1'), 114: (2502, '4'), 114: (2503, 'BackYard' )...etc.. 

Я понялчто это связано с тем, что словарь принимает только 1 значение для одного ключа.Но кто-нибудь может предложить мне обходной путь для этого?спасибо!

1 Ответ

2 голосов
/ 22 марта 2019

Типичный обходной путь - вместо этого сделать структуру данных диктовкой списков:

observed_output = {}
for row in db_cursor:
    observed_output.setdefault(row[0], []).append(row[1:3])

, чтобы вы могли получить, например:

{
    80: [(2501, '1'), (2502, '4'), (2503, 'LivingRoom')],
    81: [(2501, '2'), (2502, '5'), (2503, 'FreeSpace')], 
    ...
}

Другой вариант - сделатьprop_id часть ключа, сделав кортеж из (object_id, prop_id) ключа:

observed_output = {}
for row in db_cursor:
    observed_output[row[:2]] = row[2]

, чтобы вместо этого вы получили:

{
    (80, 2501): '1',
    (80, 2502): '4',
    (80, 2503): 'LivingRoom',
    (81, 2501): '2',
    (81, 2502): '5',
    (81, 2503): 'FreeSpace',
    ...
}

И третий вариант будетсделать структуру данных диктовкой и сделать prop_id ключом субдиктов:

observed_output = {}
for row in db_cursor:
    observed_output[row[0]][row[1]] = row[2]

, чтобы вы получили:

{
    80: {
        2501: '1',
        2502: '4',
        2503: 'LivingRoom'
    },
    81: {
        2501: '2',
        2502: '5',
        2503: 'FreeSpace'
    }
}
...