Python理解,列表字典

时间:2016-01-18 15:13:48

标签: python list-comprehension dictionary-comprehension

我无法理解这一个。还是我过于复杂化了?我试图使这个代码更“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]
    }
}

这里有几个挑战,我知道下面的代码是错误的,但是我想知道如何找到我想要的东西:

  • 如何在理解中更新字典中的列表?顺着这个。这会有用吗?对我来说,有些事情不合适。我是否被卷曲的括号带走了?

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

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

  • 我怎么能不像我原来的代码那样重复数据部分来调整long_desc? (我的字典实际上要长得多,而且对于一行重复一遍似乎很疯狂。)喜欢:then if 'statusLongDesc' in status list.extend('long_desc': status['statusLongDesc'])添加到上面的理解中。

2 个答案:

答案 0 :(得分:2)

我不会过分复杂化。您可以用来简化原件的最重要的事情是使用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字典。

答案 1 :(得分:1)

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

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
}

但我发现它不可读。