如何在一行for循环内的字典中添加另一个属性

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}).


Sco*_*ork 5

您可以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)

  • 我强烈不建议使用列表推导式来产生副作用,这是一种[众所周知的反模式](/sf/ask/402751821/只是副作用)。您正在生成“[None,None,None]”的结果并将其丢弃。 (5认同)

归档时间:

查看次数:

657 次

最近记录:

4 年,10 月 前