首页 > 解决方案 > 如何将元组列表传递给python中的函数参数

问题描述

我有以下代码可以正常工作:

def func1():
    return Pipeline([('cont_inf_replacer', replaceInf()),
                     ])

make_column_transformer((func1(), features['cat1']),
                         (func2(), features['cat2']),
                         (func3(), features['cat3'])
)

现在,我想将函数参数作为变量传递

func_dict = {'cat1': func1, 'cat2':func2, 'cat3': func3}
for c in features.keys():
    arg_tuple += (func_dict[c], features[c])

 make_column_transformer(arg_tuple)     

我希望 arg_tuple 应该扩展/解包到

                         func1(), features['cat1']),
                         (func2(), features['cat2']),
                         (func2(), features['cat3'])

但收到以下错误。我进行了搜索,但找不到合适的解决方案

 ValueError: not enough values to unpack (expected 2, got 1)

这就是 make_column_transformer() 的定义方式:

make_column_transformer(*transformers, **kwargs)

使用 *arg_tuple 解包似乎可以(调用 make_column_transfer 时没有错误,但结果不同,见下文)

make_column_transformer((func1(),features['_cat_'])): output

ColumnTransformer(n_jobs=None, remainder='drop', sparse_threshold=0.3,
     transformer_weights=None,
     transformers=[('pipeline', Pipeline(memory=None,
 steps=[('cont_inf_replacer', <__main__.replaceInf object at 0x7f87d19d6ba8>)]), ['cat1', 'cat2', 'cat3'])])

使用 *arg_tuple,

make_column_transformer(*arg_tuple)

ColumnTransformer(n_jobs=None, remainder='drop', sparse_threshold=0.3,
     transformer_weights=None,
     transformers=[('function', <function _pip_cont at 0x7f87d1a006a8>, ['cat1', 'cat2', 'cat3'])])

标签: python-3.x

解决方案


  1. make_column_transformer(*arg_tuple) 将正确解包 ((),(),())
  2. 您应该尝试以下方法

    pipline_step['cat1'] = [('test_pipeline', Pipeline([SimpleImputer(xxxxxxxx)]))] list_pipeline = Pipeline() list_pipeline.steps.append(pipeline)

因此,通过这种方式,您可以根据子集的可用性(在此示例中,cat1 可用)附加步骤,而不是 for 循环。您可以将子集名称作为键作为管道步骤传递。


推荐阅读