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

我想将两个键值从一个字典添加到一个新字典。我知道这项任务有更简单的替代方案,但我正在尝试学习如何在一行中传递参数。


    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'}


RISEBY
浏览 101回答 1
1回答

蓝山帝景

解包操作符*和**是非常有情境的——在这种情况下,只有在调用函数时才真正有用。这里的问题是您要解包的内容:只是元组,而不是整个列表理解。您得到 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'}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python