Python字典单键可能有多个值?

问题描述 投票:2回答:1

我对单键的字典有问题,但有多个值。我正在从具有3列的sqlite3数据库表(bacnet_props)中搜索一些数据。第1列有6个条目,每个条目具有相同的密钥(例如; object_id [81])。 object_ids是80,81,82,112,113,114。第二列有6个条目,每个条目具有不同的prop_id,因此6个不同的值(2501-2510)然后第3个列有6个不同的条目,每个条目具有不同的值,因此再次有6个不同的值(整数/字符串)。现在我试图通过调用第1列中的object_id来对第2列和第3列中的值进行处理,并与我的期望值进行比较以进行验证。我正在尝试使用以下代码,它只给出了带有密钥的条目,这意味着来自所有这3列的6个条目中的1个。你能帮助我解决这个问题吗?

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.. 

我明白这是因为字典只为单个键只取一个值。但有人可以建议我解决这个问题吗?谢谢!

python python-3.x list dictionary python-3.4
1个回答
2
投票

一个典型的解决方法是使数据结构成为列表的字典:

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',
    ...
}

第三种选择是使数据结构成为dicts的字母,并使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'
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.