【问题标题】:Python comprehension, dictionary of listsPython 理解,列表字典
【发布时间】:2016-01-18 15:13:47
【问题描述】:

我无法理解这一点。还是我把事情复杂化了?我正在尝试使这段代码更“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']) 添加到上述理解中。

【问题讨论】:

  • 您的原始代码更像是“pythonic”IMO。它很容易阅读,意图很明确。 Pythonic 意味着简短、简洁且易于阅读。

标签: python list-comprehension dictionary-comprehension


【解决方案1】:

我不会把事情复杂化。可以用来简化原始文件的最重要的方法是使用 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

【讨论】:

  • 我觉得很奇怪,他在迭代 data 时如何重新绑定它。
  • 好点。我将在答案中完全删除临时名称,因为它没有必要。
  • 谢谢。 get 方法是一个我不会忘记的新方法。方便。
【解决方案2】:

您可以使用理解轻松创建列表,而不是 .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
}

但我觉得它不可读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2021-03-12
    • 1970-01-01
    • 2018-03-18
    • 2020-10-18
    • 1970-01-01
    相关资源
    最近更新 更多