Python 字典单键可以有多个值吗?
Python dictionary single key with multiple values possible?
我对单键多值字典有疑问。我正在从具有 3 列的 sqlite3 数据库 table (bacnet_props) 中获取一些数据。第一列有 6 个条目,每个条目都具有相同的键(例如 object_id[81])。 object_id 是 80,81,82,112,113,114。第二列有 6 个条目,每个条目都有不同的 prop_id,所以有 6 个不同的值 (2501-2510),然后第三列有 6 个不同的条目,每个条目都有不同的值,所以又有 6 个不同的值 (integer/string)。现在我试图通过调用第一列中的 object_id 来获取第二列和第三列中的这些值,并与我的预期值进行比较以进行验证。我正在尝试使用以下代码,该代码只为我提供了一次带有密钥的条目,这意味着所有这 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..
我理解这是因为字典对单个键只取 1 个值。但是有人可以建议我解决这个问题吗?谢谢!
一个典型的解决方法是将数据结构改为列表字典:
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')],
...
}
另一种选择是通过将 (object_id, prop_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'
}
}
我对单键多值字典有疑问。我正在从具有 3 列的 sqlite3 数据库 table (bacnet_props) 中获取一些数据。第一列有 6 个条目,每个条目都具有相同的键(例如 object_id[81])。 object_id 是 80,81,82,112,113,114。第二列有 6 个条目,每个条目都有不同的 prop_id,所以有 6 个不同的值 (2501-2510),然后第三列有 6 个不同的条目,每个条目都有不同的值,所以又有 6 个不同的值 (integer/string)。现在我试图通过调用第一列中的 object_id 来获取第二列和第三列中的这些值,并与我的预期值进行比较以进行验证。我正在尝试使用以下代码,该代码只为我提供了一次带有密钥的条目,这意味着所有这 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..
我理解这是因为字典对单个键只取 1 个值。但是有人可以建议我解决这个问题吗?谢谢!
一个典型的解决方法是将数据结构改为列表字典:
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')],
...
}
另一种选择是通过将 (object_id, prop_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'
}
}