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]
}
}
这里有几个挑战,我知道下面的代码是错误的,但我试图在不知道如何实现的情况下理解我想要的:
如何在理解中更新字典中的列表?沿着这条线。这行得通吗?我觉得有些不对劲。我是不是被花括号冲昏了头脑?
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'])
添加到上面的理解中。
我不会把事情复杂化。可以用来简化原件的最大方法是使用 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
字典。
您可以使用理解轻松创建列表,而不是 .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
}
但是我觉得看不懂。
我无法理解这个问题。还是我把事情复杂化了?我试图让这段代码更 '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'])
添加到上面的理解中。
我不会把事情复杂化。可以用来简化原件的最大方法是使用 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
字典。
您可以使用理解轻松创建列表,而不是 .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
}
但是我觉得看不懂。