使用短路运算符编辑一个字典

时间:2014-07-22 06:28:45

标签: python dictionary operators

names = {'bob':3, 'jack':1,'suzy':0,'amy':5}

def only_child(d:dict)->dict:
'''if the value(# of siblings) for the key(the person) == 0, change the value to True, 
otherwise leave the dictionary entry as is.'''

    return {name:True for name in d if d[name] == 0}

这只给了我{'suzy': True}

我试过了:

return {name:True for name in d if d[name] == 0 else name:d[name]}

但我得到SyntaxError

有没有办法可以在一行代码中编写这个函数(就像我一直试图做的那样)?我想让它们尽可能简洁明了。 解决方案应该看起来像

names = {'bob':3, 'jack':1,'suzy':True,'amy':5} 

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

您正在过滤掉非零项目,请参阅以下内容:

def only_child(d:dict)->dict:
    return {name: True if num == 0 else num for name, num in d.items() }

this construct称为conditional expression,或ternary operator

您可以在不创建新字典的情况下实现相同的结果:

def only_child(d:dict)->dict:
    for name, num in d.items():
        if num == 0: d[name] = True
    return d

答案 1 :(得分:0)

如果我理解你的要求:

>>> names = {'bob':3, 'jack':1,'suzy':0,'amy':5}
>>> {k:(v==0 or v) for k,v in names.items()}
{'amy': 5, 'bob': 3, 'jack': 1, 'suzy': True}

答案 2 :(得分:0)

TL; DR:您应该将条件作为值表达式的一部分,而不是dict理解

如果您将测试置于条件中,那么理解的结果将受到限制。如果要更改值,则测试应该在值表达式中。你可以使用三元组。

{k:True if names[k]==0 else names[k] for k in names}