Python 使用splat函数和for循环传递多个函数参数
我想添加两个键,从一个dict到一个新dict的值。 我知道这项任务有更简单的替代方案,但我正在尝试学习如何在一行中传递参数Python 使用splat函数和for循环传递多个函数参数,python,python-3.x,Python,Python 3.x,我想添加两个键,从一个dict到一个新dict的值。 我知道这项任务有更简单的替代方案,但我正在尝试学习如何在一行中传递参数 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=d
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]),用于['col1','col2']中的x)
^
SyntaxError:无效语法
预期产出:
{'col1': 'Red', 'col2': 'Orange'}
解包操作符
*
和***
非常适合于情景-在这种情况下,只在调用函数时才真正有用。这里的问题是要解包什么:只是元组,而不是整个列表
您将得到一个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()
:
dict.fromkeys
只接受两个参数,并将所有键初始化为相同的值。如果你要传入一个额外的参数,你会得到一个错误
如果您想用不同的键设置为不同的值来初始化一个
dict
,那么有几种方法可以做到这一点。首先,只需使用带有2元组的dict
构造函数即可(无需解包):
或者你可以使用dict
理解,这可能更优雅、更清晰:
colors_new = {k:v for k,v in colors.items() if k in {'col1', 'col2'}}
# {'col1': 'Red', 'col2': 'Blue'}
{k:v表示k,v表示颜色。items()如果k表示{'col1',col2'}}
?感谢您的评论,很抱歉我之前不清楚。我编辑并添加了一行“我知道这项任务有更简单的替代方案,但我正在尝试学习如何在单行中传递参数。”我只写了一行“单行”,但您没有将其作为参数传递给函数。什么函数。col2
不是应该是Orange
?;)@Justin在OP的例子中是的,但OP的代码没有说明为什么会这样(考虑到橙色在颜色中不存在)别担心,我只是在玩…;)回答得好!
colors_new = dict((x, colors[x]) for x in ['col1', 'col2'])
# {'col1': 'Red', 'col2': 'Blue'}
colors_new = {k:v for k,v in colors.items() if k in {'col1', 'col2'}}
# {'col1': 'Red', 'col2': 'Blue'}