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

时间:2020-07-07 08:16:14

标签: python list dictionary

我有一个字典列表和一个字符串。我想在列表内的每个字典中添加一个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]

5 个答案:

答案 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'
    }
]
  1. 使用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.

  2. 如果您想要一个新列表而不修改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]