从嵌套dict中的键获取下一个值

2024-05-16 01:55:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我的旧代码以以下形式存储设备_name.id及其分配的sACN universe:

prev = {
  "312398": 1,
  "232312": 2,
  "312353": 3
}

现在我将它存储为一个带有附加属性的嵌套dict device_name.model如下所示:

current = {
  "312341": {
   "model": "Some-Model",
   "universe": 1
  },
  "532342": {
    "model": "Some-other-model",
    "universe": 2
  }
}

我的旧代码有一个函数

def get_free_universe():
        return next(
           i
           for i in range(1, 128)
           if i not in conf.values()
    )

这样称呼:

device_count = sdk.get_device_count() #setup Corsair devices config
for device_index in range(device_count):
    device_name = sdk.get_device_info(device_index)
    device_type = device_name.type
    if device_name.id not in conf:
        if conf.keys == " ":
            print("config empty, universer = 1")
            universe = 1
        else: 
            universe = get_free_universe()
        conf.update({device_name.id: {"model": device_name.model, "universe": universe}}) 
        print(f"conf= {conf}")
    else:
        universe = conf[device_name.id]

现在当然if i not in conf.values()部分不再工作了。我需要查看每个dict的键universe。我怎样才能做到?目前,由于带有device_name.id的dicts的值本身没有一个值,因此我无法获得下一个数字,它只会给每个设备_name.id相同的宇宙(1)


Tags: 代码nameinidfreegetmodelif
2条回答

您只需查找0到127范围内的第一个值,该值尚未用作主dict的dict值的任何“universe”键的值:

def get_free_universe(conf):
    universe_values = [x['universe'] for x in conf.values()]
    return next(i for i in range(128) if i not in universe_values)

请注意,如果128以下没有可用值,这将抛出一个StopIteration,就像您自己的代码一样

一个选项是在新映射中创建所有宇宙值的set。例如,使用上面示例中的映射:

>>> universes = {v['universe'] for v in current.values()}
>>> universes
{1, 2}

然后,您可以使用新变量universes而不是前面所做的conf.values()。当然,如果您生成并分配了一个新的宇宙,您还需要记住将其添加到此哈希集,如下所示:

>>> universes.add(3)
>>> universes
>>> {1, 2, 3}

然后需要对get_free_universe函数稍加修改:

def get_free_universe():

    # generate a new universe
    new_universe = next(
        i
        for i in range(1, 128)
        if i not in universes
    )
    
    # add to known universes
    universes.add(new_universe)
    
    return new_universe

相关问题 更多 >