我有一个字典列表和一个字符串。我想在列表内的每个字典中添加一个selected
属性。我想知道是否可以使用一个衬垫。
这是我的输入内容:
saved_fields = "apple|cherry|banana".split('|')
fields = [
{
'name' : 'cherry'
},
{
'name' : 'apple'
},
{
'name' : 'orange'
}
]
这是我的预期输出:
[
{
'name' : 'cherry',
'selected' : True
},
{
'name' : 'apple',
'selected' : True
},
{
'name' : 'orange',
'selected' : False
}
]
我尝试过:
new_fields = [item [item['selected'] if item['name'] in saved_fields] for item in fields]
答案 0 :(得分: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}]
简单。明确的。显而易见。
这会就地更新词典,如果除了“名称”和“状态”之外您还有很多记录或其他键,那么最好这样做。
如果您坚持使用单线,则此键会保留其他键:
[{**d, 'status': d['name'] in s} for d in fields]
# [{'name': 'cherry', 'status': True},
# {'name': 'apple', 'status': True},
# {'name': 'orange', 'status': False}]
这是list comprehension syntax,它会创建一个新的字典列表,而原始字典保持不变。
{**d, ...}
部分对于保留未经其他修改的密钥是必需的。我没有看到其他答案,因此认为值得一呼。
扩展的解压缩语法仅适用于python3.5 +,对于较旧的版本,请将{**d, 'status': d['name'] in s}
更改为dict(d, **{'status': d['name'] in s})
。
答案 1 :(得分:5)
您可以使用选定的密钥更新dictionairy
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}]
答案 2 :(得分:4)
result = [
{"name": fruit['name'],
"selected": fruit['name'] in saved_fields }
for fruit in fields
]
>>> [{'name': 'cherry', 'selected': True},
{'name': 'apple', 'selected': True},
{'name': 'orange', 'selected': False}]
单线:
result = [{"name": fruit['name'], "selected": fruit['name'] in saved_fields} for fruit in fields]
答案 3 :(得分:3)
即使字典中有多个条目,建议的解决方案也将起作用。
接受您的输入:
saved_fields = "apple|cherry|banana".split('|')
fields = [
{
'name' : 'cherry'
},
{
'name' : 'apple'
},
{
'name' : 'orange'
}
]
使用Dict.update()
:
>>> [item.update({'selected': item['name'] in saved_fields}) for item in fields]
[None, None, None]
将返回[None, None, None]
,但就地修改fields
变量。
>>> fields
[{'name': 'cherry', 'selected': True},
{'name': 'apple', 'selected': True},
{'name': 'orange', 'selected': False}]
请注意,虽然这是单线的,但这是not always recommended.
如果您想要一个新列表而不修改fields
。可以使用Dict cf上的**
运算符来完成,如@ cs95答案所示。 ** explanation:
>>> new_fields = [{**item, 'selected': item['name'] in saved_fields} for item in fields]
>>> new_fields
[{'name': 'cherry', 'selected': True},
{'name': 'apple', 'selected': True},
{'name': 'orange', 'selected': False}]
>>> fields
[{'name': 'cherry'}, {'name': 'apple'}, {'name': 'orange'}]
答案 4 :(得分:2)
[{'name': item['name'], 'selected': item['name'] in saved_fields} for item in fields]