为了账号安全,请及时绑定邮箱和手机立即绑定

使用 splat 函数和 for 循环传递多个函数参数

使用 splat 函数和 for 循环传递多个函数参数

RISEBY 2022-04-23 21:17:04
我想将两个键值从一个字典添加到一个新字典。我知道这项任务有更简单的替代方案,但我正在尝试学习如何在一行中传递参数。    colors = {'col1' : 'Red', 'col2' : 'Blue', 'col3' : 'Yellow'}    colors_new = dict.fromkeys( *(x,colors[x]) for x in ['col1','col2'] )    print(colors_new)错误文件“”,第 5 行 colors_new = dict.fromkeys( *(x,colors[x]) for x in ['col1','col2'] ) ^ SyntaxError: invalid syntax预期输出:{'col1': 'Red', 'col2': 'Orange'}
查看完整描述

1 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

解包操作符*和**是非常有情境的——在这种情况下,只有在调用函数时才真正有用。这里的问题是您要解包的内容:只是元组,而不是整个列表理解。


您得到 a 是SyntaxError因为您尝试解包的元组不在可以正确解包的上下文中(并且 python 不知道您通过for之后执行循环来尝试做什么)。这是因为它并不直接在函数调用内部——它在生成器理解内部,它本身就在函数调用内部)。


您可能会做的另一种选择是添加另一组括号:


colors_new = dict.fromkeys( *((x,colors[x]) for x in ['col1','col2']) )

这相当于调用


colors_new = dict.fromkeys(('col1','Red'), ('col2','Blue'))

# colors_new = {'col1': ('col2', 'Blue'), 'Red': ('col2', 'Blue')}

这不是您想要做的,并且是由于对以下内容的误解dict.fromkeys():


fromkeys(iterable, value=None, /) method of builtins.type instance

    Create a new dictionary with keys from iterable and values set to value.

dict.fromkeys恰好接受两个参数,并将所有键初始化为相同的值。如果你要传递一个额外的参数,你会得到一个错误。


如果您想dict用设置为不同值的不同键来初始化 a,那么有几种方法可以做到这一点。一方面,只需使用dict带有 2-tuples 的构造函数就可以了(不需要解包 uperator):


colors_new = dict((x, colors[x]) for x in ['col1', 'col2'])

# {'col1': 'Red', 'col2': 'Blue'}

或者你可以使用一种dict理解,它可能更优雅、更清晰:


colors_new = {k:v for k,v in colors.items() if k in {'col1', 'col2'}}

# {'col1': 'Red', 'col2': 'Blue'}


查看完整回答
反对 回复 2022-04-23
  • 1 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信