0

我将解释这个例子,因为它更容易描述这种方式:

假设我们有未确定 (X) 数量的变量,可以是列表或字符串。

例如,X=3,我们有:

Var1=list("a","b")
Var2=list("c","d")
Var3="e"

所有这些都在一个列表中:ListOfVariables=[Var1,Var2,Var3]

然后我们有一个在这些变量上运行的函数(我们事先并不知道这个函数,但它使用了与我们拥有的相同数量 X 的变量)。

def Function(Var1,Var2,Var3)
    print Var1
    print Var2
    print Var3

这里的目标是使函数与所有输入变量一起运行,如果其中一个是列表,它必须为列表的每个项目执行函数。所以想要的结果是为所有这些调用 Function ,如下所示:

Function(a,c,e)
Function(a,d,e)
Function(b,c,e)
Function(b,d,e)

到目前为止,我使用了一个辅助函数来识别 Var1、Var2 和 Var3,但是我的大脑没有那么多的递归可预测性,无法定义这个 HelperFunction,例如:

def HelperFunction():
    for item in ListOfVariables:
        if type(item).__name__=='list':
            #This one will be done as a "for", so all the items in this list are executed as input (Var1 and Var2 in the example)
        else:
            #This item doesnt need to be included in a for, just execute once (Var3 in the example)

我知道它可以用 python 来完成,但我无法在脑海中编写我需要的函数,它比我的“大脑模拟器”可以模拟 python 的复杂程度高一倍 =(

非常感谢您的帮助。


回答后编辑:

非常感谢您的回答,但我不确定建议的解决方案是否能解决问题。如果我们运行:

helper_function(ListOfVariables)

那么 helper_function 应该调用函数“Function”4 次,如下所示:

Function(a,c,e)
Function(a,d,e)
Function(b,c,e)
Function(b,d,e)

目的是使用输入中的所有变量,但在函数需要的相应位置。更具体地说,helper_function(ListOfVariables) 的逻辑过程是:

Var1 是一个列表,因此,我将不得不遍历它的 contains 并使用它们运行 Function() ,但这些只会是函数的第一个参数!

Var2 是一个列表,因此,我也会循环,其中项目只是 Function() 的第二个参数

Var3 是单个项目,因此,对于其他两个循环,该值将被分配为常数。

这就是我们获得所需的方式:

Function(a,c,e)
Function(a,d,e)
Function(b,c,e)
Function(b,d,e)

非常感谢,我自己也搞不懂!

4

5 回答 5

5

如果我对您的理解正确,那么进一步概括问题:您想在参数中所有元素的乘积上迭代函数;非列表参数应被视为仅包含它们自己的列表。使用该itertools模块,并将其视为迭代而不是递归过程可以简化事情:

import itertools

def combine(*args):
    lists = [arg if isinstance(arg, list) else [arg] for arg in args]
    for a, b, c in itertools.product(*lists):
        Function(a, b, c)

Var1=["a","b"]
Var2=["c","d"]
Var3="e"

combine(Var1, Var2, Var3)

如果您需要处理列表列表,那么您需要一个递归过程。

于 2013-10-24T17:24:19.537 回答
1

如果我对您的理解正确,您不知道期望有多少参数并且您希望在它们上运行一个函数。如果是这样,您想使用*来定义将被视为列表的未知数量的参数。那么它只是一个条件,就像这样:

def some_name(*args):
    for arg in args:
        if isinstance(arg, list):
            some_name(*arg)
        if isinstance(arg, str):
            print arg

是这样吗?

于 2013-10-24T17:07:51.747 回答
1

这就是您要寻找的内容吗?

def helper_function(my_list):
    for item in my_list:
        if isinstance(item, basestring):
            do_something(item)
        else:
            helper_function(item)

如果列表中的项目是一个字符串,那么你对它运行你的函数。如果不是,那么您只需在项目上再次调用辅助函数,因为它接受任何包含字符串的任意列表。

于 2013-10-24T17:05:31.127 回答
0
def recurse_me(my_list):
    if not isinstance(my_list,(list,tuple)):
        print "Unexpected Arg! not a list!!:",my_list
    for item in my_list:
        if isinstance(item,(list,tuple)):
            print "Recursive Call! recurse_me(%s)"%item
            recurse_me(item)
         else:
            print "Normal:",item

不确定这是否是你想要的,但我想是的

于 2013-10-24T17:04:48.140 回答
0

为什么不直接使用参数?

def func(*vars):
  for var in vars:
    dostuff_with_var(var)

dostuff_with_var您可以检查类型并采取相应措施。

于 2013-10-24T17:06:47.967 回答