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}
任何帮助将不胜感激。
答案 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}