我用python编写了一个函数,它接受三个输入变量。现在,我想对每个输入变量的项列表调用函数。所以函数调用是这样的:
call_function('cat', 'brown', 2)名单如下:
category_list = ['cat', 'dog', 'squirrel']
color_list = ['brown', 'black']
age = [1,2,3]现在,我想对每个项目运行函数。因此,它应该返回猫,棕色和1,然后猫,棕色和2,然后猫,棕色和3,然后猫,黑色和1,然后猫,黑色和2,然后猫,黑色和3,然后做同样的狗,然后松鼠。我知道我需要在一个循环中调用这个函数,但是我尝试并失败了几次。有人能帮我吗?
发布于 2022-06-24 13:40:41
使用itertools,它为您完成了任务,调用product函数非常简单。
将变量作为参数提供给itertools.product(....)),然后list()响应。
代码
import itertools
category_list = ['cat', 'dog', 'squirrel']
color_list = ['brown', 'black']
age = [1,2,3]
def call_function(category, color, age):
print(category, color, age)
combinations = list(itertools.product(category_list, color_list, age))
for combintaion in combinations:
call_function(combintaion[0], combintaion[1], combintaion[2])输出
cat brown 1
cat brown 2
cat brown 3
cat black 1
cat black 2
cat black 3
dog brown 1
dog brown 2
dog brown 3
dog black 1
dog black 2
dog black 3
squirrel brown 1
squirrel brown 2
squirrel brown 3
squirrel black 1
squirrel black 2
squirrel black 3证明
测试这里

迭代工具中的方法代码
def product(*args, repeat=1):
# product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
# product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
pools = [tuple(pool) for pool in args] * repeat
result = [[]]
for pool in pools:
result = [x+[y] for x in result for y in pool]
for prod in result:
yield tuple(prod)发布于 2022-06-24 14:28:43
下面是另一种方法,在使用pd.apply创建数据后使用itertools.product
import itertools
category_list = ['cat', 'dog', 'squirrel']
color_list = ['brown', 'black']
age = [1,2,3]
df=pd.DataFrame.from_records(
list(itertools.product(
category_list, color_list, age
)), columns=['category', 'color', 'age'])
df.apply(lambda row: call_function(row['category'], row['color'], row['age']), axis=1)结果:
cat brown 1
cat brown 2
cat brown 3
cat black 1
cat black 2
cat black 3
dog brown 1
dog brown 2
dog brown 3
dog black 1
dog black 2
dog black 3
squirrel brown 1
squirrel brown 2
squirrel brown 3
squirrel black 1
squirrel black 2
squirrel black 3如果函数名为MY_FUNCTION
df.apply(lambda row: MY_FUNCTION(row['category'], row['color'], row['age']), axis=1)

发布于 2022-06-25 07:01:05
我通过循环调用函数来解决这个问题。我确信有一种更有效/更优雅的方法可以做到这一点,但是由于我的df和列表都很小,所以效果很好。想发布我的解决方案,为那些正在工作的小名单和有类似的问题。当然,改善建议是受欢迎的。
for i in category_list:
for j in color_list:
for k in age:
call_function(i,j,k)https://stackoverflow.com/questions/72744844
复制相似问题