【问题标题】:Building tuple arguments for function为函数构建元组参数
【发布时间】:2014-11-26 05:33:14
【问题描述】:

我正在关注 F Sebastian 的回答; Python multiprocessing pool.map for multiple arguments 正在使用多处理来计算函数。我正在参数输入中进行构建,并且我希望 function_star 的固定输入为“1”、“2”,而可变输入为“x”和“y”,但是当我尝试以下操作时:

args = itertools.izip(('x', 'y'), itertools.repeat(('1', '2')))

我得到以下信息:

('x', ('1', '2')) ('y', ('1', '2'))

但我想加入 itertools 中的元组,以便我可以将其发送到:

pool.map(func_star, args)

我想要更类似于 itertools 中的第一个元素的东西:

('x', '1', '2')...

所以我的 function_star 已将这个参数转换为三个。

【问题讨论】:

  • 我认为您正在尝试扁平化元组。您可以查看这个previous 问题以获得一些想法。让我知道这是否适合您。

标签: python multiprocessing


【解决方案1】:

我认为对于固定参数,使用functools.partial 而不是itertools.repeat 更容易。然后你只需压缩你的变量参数并将它们传递给一个func_star,它需要两个固定的参数,然后是一个变量参数的元组:

import multiprocessing
from functools import partial

def func(a, b, c, d):
   print("{} {} {} {}".format(a, b, c, d))

def func_star(a, b, c_d):
   func(a, b, *c_d)

if __name__ == "__main__":
    pool = multiprocessing.Pool()
    partfunc = partial(func_star, '1', '2') # '1' and '2' are the fixed args
    var_list1 = ['a', 'b', 'c']
    var_list2 = ['x', 'y', 'z']
    pool.map(partfunc, zip(var_list1, var_list2))

输出:

1 2 a x
1 2 b y
1 2 c z

【讨论】:

    【解决方案2】:

    您可以尝试使用itertools.chain.from_iterable 来扁平化您的列表。

    示例(我两次调用链,因为你有嵌套列表..):

    args = itertools.izip(('x', 'y'), itertools.repeat(('1', '2')))
    itertools.chain.from_iterable( itertools.chain.from_iterable( args ) )
    <itertools.chain object at 0x26F7E7F0>
    list( _ )
    ['x', '1', '2', 'y', '1', '2']
    

    第二个例子(不确定你到底想达到什么目的):

    args = itertools.izip(('x', 'y'), itertools.repeat(('1', '2')))
    [ list( itertools.chain.from_iterable( arg ) ) for arg in args ]
    [['x', '1', '2'], ['y', '1', '2']]
    

    【讨论】:

    • 是不是有点复杂?
    • 是的,同意!但它展示了如何将 Navanod 提供的“args”转换为平面列表。
    【解决方案3】:

    为什么要使用 itertools?

    >>> fixed = ("1", "2")
    >>> variant = ("x", "y")
    >>> argsgen = ((v,) + fixed for v in variant)
    >>> list(argsgen)
    [('x', '1', '2'), ('y', '1', '2')]
    

    【讨论】:

      猜你喜欢
      • 2013-01-31
      • 2019-10-23
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多