繁体   English   中英

如何从逗号分隔的字符串字典中制作一个字典?

[英]How to make one dict from comma separated string dicts?

我有两个字符串变量:

  a = [
{ 
'hash': 'same hash for all photos'
'name': 'test.jpg'
},

{
'hash': 'same hash for all photos'
'name': 'test2.jpg'
},
{
'hash': 'same hash for all photos'
'name': 'test3.jpg' 
}
]


b = [

{

       'Exists': [
     {
       'db': 'main_db'
       'size': 'photo_size'
       'path': 'path'

     },

     {
        'db': 'main_db2'
       'size': 'photo_size'
       'path': 'path'

     }],

'Exists': for another photo

}
]

最后我需要一个json 'Exists' - 是每张照片的数据,所以 append 对照片有好处。 默认情况下,它们不是 str - 它们是自定义类型的数据

我试过的

我尝试使用 str 上的json.dumps从它们制作 json 字符串。 它有效,但我无法连接它们。 列表创建字典,然后连接字典,但ast.literal_eval崩溃。 将两个字符串连接为一个并手动更改字符创建一个字典。 结果 - json.dumps出现错误。

有没有一种简单的方法可以做到这一点? 或者至少 - 有什么想法吗?

更新

Output print(b)

[{
    'Exists': [
        {
            'db': 'db_main',
            'size': 5451.0,
            'path': '/www/photos3/'
        },
        {
            'db': 'db_main',
            'size': 5901.0,
            'path': '/www/photos1/'
        },
        {
            'db': 'db_add',
            'size': 4418.0,
            'path': '/www/photos4/'
        }
    ]
}, {
    'Exists': [
        {
            'db': 'db_main',
            'size': 6461.0,
            'path': '/www/photos1/'
        },
        {
            'db': 'db_main',
            'size': 3941.0,
            'path': '/www/photos1/'
        },
        {
            'db': 'db_main',
            'size': 7428.0,
            'path': '/www/photos3/'
        }
    ]
}]

关于类型。

print(type(b)) - 列表

print(type(b[0])) - zeep.objects.MatchedArray

示例 json 输出:

     {
               '1':[{
        'name': ''
        'data_from_exists':[{
    'db':...
    'size':...
    'path':...
    
                            },
    
         {'db':...
    'size':...
    'path':...
    
                            }]
        
        
        }],
'2': and same as first
    }

您可以尝试将它们放入一个组合列表中:

new_list = []

for i in range(len(a)):
    new_list.append({'photo': a[i], 'exist': b[i]})

json.dumps(new_list)

根据您的编辑,这a我正在使用的:

[{'hash': 'same hash for all photos', 'name': 'test.jpg'},
 {'hash': 'same hash for all photos', 'name': 'test2.jpg'},
 {'hash': 'same hash for all photos', 'name': 'test3.jpg'}]

这是b

[{'Exists': [{'db': 'db_main', 'size': 5451.0, 'path': '/www/photos3/'},
             {'db': 'db_main', 'size': 5901.0, 'path': '/www/photos1/'},
             {'db': 'db_add', 'size': 4418.0, 'path': '/www/photos4/'}]},
 {'Exists': [{'db': 'db_main', 'size': 6461.0, 'path': '/www/photos1/'},
             {'db': 'db_main', 'size': 3941.0, 'path': '/www/photos1/'},
             {'db': 'db_main', 'size': 7428.0, 'path': '/www/photos3/'}]}]

对于以下选项, ab的长度必须相同。 示例数据在a中有 3 个图像,但在b中只有 2 个“存在”,因此结果将匹配每个中的前两个项目。

1.创建名称的字典info Name: Exists data

info = {i['name']: j['Exists'] for i, j in zip(a, b)}
json.dumps(info)

Output 是:

{
    "test.jpg": [
        {
            "db": "db_main",
            "size": 5451.0,
            "path": "/www/photos3/"
        },
        {
            "db": "db_main",
            "size": 5901.0,
            "path": "/www/photos1/"
        },
        {
            "db": "db_add",
            "size": 4418.0,
            "path": "/www/photos4/"
        }
    ],
    "test2.jpg": [
        {
            "db": "db_main",
            "size": 6461.0,
            "path": "/www/photos1/"
        },
        {
            "db": "db_main",
            "size": 3941.0,
            "path": "/www/photos1/"
        },
        {
            "db": "db_main",
            "size": 7428.0,
            "path": "/www/photos3/"
        }
    ]
}

2.如果您希望它们“在一起但分开”并以递增计数器作为键(为什么?),那么您可以这样做:

# Python 3.5 or greater
info = {str(idx): {**i, **j} for idx, (i, j) in enumerate(zip(a, b), start=1)}
json.dumps(info)

Output:

{
    "1": {
        "hash": "same hash for all photos",
        "name": "test.jpg",
        "Exists": [
            {
                "db": "db_main",
                "size": 5451.0,
                "path": "/www/photos3/"
            },
            {
                "db": "db_main",
                "size": 5901.0,
                "path": "/www/photos1/"
            },
            {
                "db": "db_add",
                "size": 4418.0,
                "path": "/www/photos4/"
            }
        ]
    },
    "2": {
        "hash": "same hash for all photos",
        "name": "test2.jpg",
        "Exists": [
            {
                "db": "db_main",
                "size": 6461.0,
                "path": "/www/photos1/"
            },
            {
                "db": "db_main",
                "size": 3941.0,
                "path": "/www/photos1/"
            },
            {
                "db": "db_main",
                "size": 7428.0,
                "path": "/www/photos3/"
            }
        ]
    }
}

3. {image name: {'hash': hash, 'Exists': exists data}}更合理的布局:

(您可以轻松地修改它以使用 hash 作为主键,而不是名称。)

info = {i['name']: {'hash': i['hash'],
                    'Exists': j['Exists']}
        for i, j in zip(a, b)}

Output:

{
    "test.jpg": {
        "hash": "same hash for all photos",
        "Exists": [
            {
                "db": "db_main",
                "size": 5451.0,
                "path": "/www/photos3/"
            },
            {
                "db": "db_main",
                "size": 5901.0,
                "path": "/www/photos1/"
            },
            {
                "db": "db_add",
                "size": 4418.0,
                "path": "/www/photos4/"
            }
        ]
    },
    "test2.jpg": {
        "hash": "same hash for all photos",
        "Exists": [
            {
                "db": "db_main",
                "size": 6461.0,
                "path": "/www/photos1/"
            },
            {
                "db": "db_main",
                "size": 3941.0,
                "path": "/www/photos1/"
            },
            {
                "db": "db_main",
                "size": 7428.0,
                "path": "/www/photos3/"
            }
        ]
    }
}

暂无
暂无

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

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