Python 理解,列表字典

Python comprehension, dictionary of lists

我无法理解这个问题。还是我把事情复杂化了?我试图让这段代码更 'Pythonic'.

statuses = {record['id'] : [] for record in data}

for record in data:
    for status in record['statuses']:
        data = {
            'status_code': status['statusCode'],
            'short_desc': status['statusShortDesc'],
        }

        if 'statusLongDesc' in status:
            data.update({'long_desc': status['statusLongDesc']})
        else:
            data.update({'long_desc': ''})

        statuses[record['id']] += [data]
    }
}

这里有几个挑战,我知道下面的代码是错误的,但我试图在不知道如何实现的情况下理解我想要的:

这会产生 TypeError: unhashable type: 'dict'

我不会把事情复杂化。可以用来简化原件的最大方法是使用 get 方法。

statuses = {record['id']: [] for record in data}

for record in data:
    for status in record['statuses']:           
        statuses[record['id']].append({
            'status_code': status['statusCode'],
            'short_desc': status['statusShortDesc'],
            'long_desc': status.get('statusLongDesc', ''),
        })

现在,如果需要,您可以将循环替换为使用列表推导的字典推导。

statuses = { record['id']: [{...} for status in record['statuses']] for record in data }

其中 {...} 是原文中的 data 字典。

您可以使用理解轻松创建列表,而不是 .appending:

statuses = {}

for record in data:
    statuses[record['id']] = [
        {
            'status_code': status['statusCode'],
            'short_desc': status['statusShortDesc'],
            'long_desc': status.get('statusLongDesc', ''),
        } for status in record['statuses']
    ]

如果我的嵌套理解正确,也可以用这种方式在一个表达式中完成:

statuses = {
    record['id']: [{
            'status_code': status['statusCode'],
            'short_desc': status['statusShortDesc'],
            'long_desc': status.get('statusLongDesc', ''),
        } for status in record['statuses']
    ] for record in data
}

但是我觉得看不懂。