sim*_*guy 7 python dictionary list
我有一个字典列表和一个字符串。我想selected在列表内的每个字典中添加一个属性。我想知道这是否可以使用单衬。
这是我的输入:
saved_fields = "apple|cherry|banana".split('|')
fields = [
{
'name' : 'cherry'
},
{
'name' : 'apple'
},
{
'name' : 'orange'
}
]
Run Code Online (Sandbox Code Playgroud)
这是我的预期输出:
[
{
'name' : 'cherry',
'selected' : True
},
{
'name' : 'apple',
'selected' : True
},
{
'name' : 'orange',
'selected' : False
}
]
Run Code Online (Sandbox Code Playgroud)
我试过这个:
new_fields = [item [item['selected'] if item['name'] in saved_fields] for item in fields]
Run Code Online (Sandbox Code Playgroud)
cs9*_*s95 13
我不一定认为“单行方式”是最好的方式。
s = set(saved_fields) # set lookup is more efficient
for d in fields:
d['status'] = d['name'] in s
fields
# [{'name': 'cherry', 'status': True},
# {'name': 'apple', 'status': True},
# {'name': 'orange', 'status': False}]
Run Code Online (Sandbox Code Playgroud)
简单的。明确的。明显的。
这会就地更新您的字典,如果您有很多记录或除“名称”和“状态”之外的其他键但您没有告诉我们,这会更好。
如果你坚持单行,这是一个保留其他键:
[{**d, 'status': d['name'] in s} for d in fields]
# [{'name': 'cherry', 'status': True},
# {'name': 'apple', 'status': True},
# {'name': 'orange', 'status': False}]
Run Code Online (Sandbox Code Playgroud)
这是列表理解语法,并创建一个新的字典列表,保持原来的不变。
该{**d, ...}部分对于保留未以其他方式修改的密钥是必要的。我没有看到任何其他答案这样做,所以认为值得一提。
扩展解包语法仅适用于 python3.5+,对于旧版本,更改{**d, 'status': d['name'] in s}为dict(d, **{'status': d['name'] in s}).
您可以dictionary使用选定的密钥更新
for x in fields: x.update({'selected': x['name'] in saved_fields}):
print(fields)
[{'name': 'cherry', 'selected': True},
{'name': 'apple', 'selected': True},
{'name': 'orange', 'selected': False}]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
657 次 |
| 最近记录: |