繁体   English   中英

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

[英]Python dictionary single key with multiple values possible?

我对单键但多值的字典有问题。 我正在从具有 3 列的 sqlite3 数据库表 (bacnet_props) 中获取一些数据。 第一列有 6 个条目,每个条目都具有相同的键(例如;object_id[81])。 object_ids 是 80,81,82,112,113,114。 第二列有 6 个条目,每个条目都有不同的 prop_id,所以 6 个不同的值(2501-2510),然后第三列有 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.. 

我明白这是因为字典只为单个键取 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')], 
    ...
}

另一种选择是让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的 dict 并使prop_id成为 sub- 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'
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM