【问题标题】:Editing dictionary key names based on a specific value根据特定值编辑字典键名
【发布时间】:2021-11-17 15:12:12
【问题描述】:

在 Python 中转换为字符串表示的字典后,我希望根据特定值编辑一些键名。以下是字符串格式的字典示例:

s = '{"some.info": "ABC","more.info": "DEF","device.0.Id":"12345678", "device.0.Type":"DEVICE-X", ' \
'"device.0.Status":"ACTIVE", "device.1.Id":"123EFEF8", "device.1.Type":"DEVICE-Y", "device.1.Status":"NOT FOUND", ' \
'"device.2.Id":"ABCD4328", "device.2.Type":"DEVICE-Z", "device.2.Status":"SLEEPING", "other.info":"Hello", ' \
'"additional.info":"Hi Again",}'

我在下面有一个工作方法,它将字符串转换为字典,扫描包含“.Type”的键条目,并将要替换的键部分的元组放入列表中,以及替换它的内容。但是整个过程似乎效率太低,有没有更好的方法来做到这一点?

我的字典中有这样感兴趣的键值对:

'device.0.Type':'DEVICE-X'
'device.1.Type':'DEVICE-Y'
'device.2.Type':'DEVICE-Z'

我要做的是将 device.X 的所有键名实例更改为键 'device.X.Type' 的值。

例如:

'device.0.Id':'12345678', 'device.0.Type':'DEVICE-X', 'device.0.Status':'ACTIVE',
'device.1.Id':'123EFEF8', 'device.1.Type':'DEVICE-Y', 'device.1.Status':'NOT FOUND', etc

会变成:

'DEVICE-X.Id':'12345678', 'DEVICE-X.Type':'DEVICE-X', 'DEVICE-X.Status':'ACTIVE',
'DEVICE-Y.Id':'123EFEF8', 'DEVICE-Y.Type':'DEVICE-Y', 'DEVICE-Y.Status':'NOT FOUND', etc

基本上,我希望使用基于设备类型更易于阅读的内容来消除“device.X”的歧义

这是我的冗长版本:

s = '{"some.info": "ABC","more.info": "DEF","device.0.Id":"12345678", "device.0.Type":"DEVICE-X", ' \
    '"device.0.Status":"ACTIVE", "device.1.Id":"123EFEF8", "device.1.Type":"DEVICE-Y", "device.1.Status":"NOT FOUND", ' \
    '"device.2.Id":"ABCD4328", "device.2.Type":"DEVICE-Z", "device.2.Status":"SLEEPING", "other.info":"Hello", ' \
    '"additional.info":"Hi Again",}'

d = eval(s)

devs = []
for k, v in d.items():
    if '.Type' in k:
        devs.append((k.split('.Type')[0], v))

for item in devs:
    if item[0] in s:
        s = s.replace(item[0], item[1])

s = eval(s)
print(s)

【问题讨论】:

    标签: python python-3.x dictionary


    【解决方案1】:

    您可以通过将数据加载为 json,然后对其进行迭代来解决此问题:

    import json
    
    s = '{"some.info": "ABC","more.info": "DEF","device.0.Id":"12345678", "device.0.Type":"DEVICE-X", "device.0.Status":"ACTIVE", "device.1.Id":"123EFEF8", "device.1.Type":"DEVICE-Y", "device.1.Status":"NOT FOUND", "device.2.Id":"ABCD4328", "device.2.Type":"DEVICE-Z", "device.2.Status":"SLEEPING", "other.info":"Hello", "additional.info":"Hi Again"}'
    
    # load the string to a dictionary
    devices_data = json.loads(s)
    
    device_names = {}
    for key, value in devices_data.items():
        if key.endswith("Type"):
            # if the key looks like a device type, store the value
            device_names[key.rpartition(".")[0]] = value
            
    renamed_device_data = {}
    for key, value in devices_data.items():
        x = key.rpartition(".")  # split the key apart
        if x[0] in device_names: # check if the first part matches a device name
            renamed_device_data[f"{device_names[x[0]]}.{x[2]}"] = value  # add the new key to the renamed dictionary with the value
        else:
            renamed_device_data[key] = value  # for non-matches, put them in as is
    

    这当然可以优化,但至少应该可以工作!

    【讨论】:

      猜你喜欢
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      • 2023-01-21
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多