【问题标题】:Mapping list of functions to list of items element-wise按元素将函数列表映射到项目列表
【发布时间】:2021-01-22 13:39:37
【问题描述】:

我有 3 个函数(f1f2f3),每个函数接受一个输入并返回一个 str

这些函数以接收输入之前由程序中的设置确定的顺序存储在列表中。每次运行程序时,它们的顺序可能不同:

# User A's run:
funcs = [f1, f1, f2, f1, f3]

# User B's run:
funcs = [f3, f3, f2]

在程序执行期间,将生成与funcs 的顺序相对应的输入列表。也就是说inputs列表中每个索引的item类型将是函数在funcs对应索引处所期望的正确类型:

# f1 expects int
# f2 expects float
# f3 expects str

funcs = [f1, f1, f2, f1, f3]
inputs = [0, 1, 3.14, 10, 'abc']

我需要将funcs 映射到inputs 元素并连接生成的字符串。目前我通过使用zip来解决这个问题:

result = ''.join(f(i) for f, i in zip(func, inputs))

还有其他方法可以实现这种类型的映射还是zip 是理想的方法?

【问题讨论】:

  • zip 似乎是最有效的方式;您可以遍历并执行 funcs 列表中的每个项目,但您的实现更简洁。
  • 我看到的唯一可能更好的方法是用列表理解替换生成器以提高效率。
  • zip 有效且清晰。人们会不同意什么是“理想”。
  • @superbrain 列表理解以何种方式更有效?生成器显然具有内存效率,但join() 在列表理解方面表现更好吗? 编辑:发现this 帖子解释了实现中的显式转换。
  • @pasta_sauce 另见this

标签: python algorithm mapping


【解决方案1】:

我认为您可以导入 FunctionType 并将每个函数直接映射到每个输入(尝试使用 lambda 列表,它确实有效):

from types import FunctionType
funcs = [f1,f1,f2,f1,f3]
inputs = [0, 1, 3.14, 10, 'abc']
"".join(map(FunctionType.__call__, funcs, inputs))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-27
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多