【问题标题】:Apply a list of functions to every item in a list?将函数列表应用于列表中的每个项目?
【发布时间】:2017-08-23 20:12:30
【问题描述】:

我正在制作一个适用于以下一般形式的聊天文件的程序:

  1. 打开文件和导入行(通过readlines
  2. 执行初始传递,通过以下方式将字符串列表转换为格式更好的数据(当前为 dicts):
    • 丢弃畸形行
    • 从消息文本中分离出用户名
    • 为被忽略的(通常是机器人)用户丢弃线路
    • 标记哪些行是/me 命令
  3. 再次遍历字典列表以对其应用各种操作,例如:
    • 用别名替换所有提及的昵称
    • /me 命令应用特殊格式

与其在配置文件中有多个开关并在循环中进行大量if 语句检查,我相信如果我在其他地方生成函数列表然后向程序提供字典列表(或字符串,取决于我在程序的哪个部分)和函数列表,以便函数列表应用于对象列表中的每个项目。

It seems that this probably would be a good case for list comprehensions 如果我只对每个项目应用一个函数,但我不想为我要调用的每个函数单独传递日志。不过this answer notes that list comprehension probably aren't what I want, since they return a completely new list,而不是原地修改。


拥有以下两种变体是我的最佳选择吗?

for item in list:
    item = a(b(c(d(item, dparam1, dparam2), cparam)), aparams)

(为了便于阅读,我将每个函数单独放在一行中,例如:

for item in list:
    item = d(item, dparam1, dparam2)
    item = c(item, cparam)
    item = b(item)
    item = a(item, aparams)

但是,以上内容并没有消除对所有开关进行if 检查的需要,并且不允许在两个不同的位置应用函数a,除非我明确添加开关来这样做。

【问题讨论】:

  • 您能否提供一些示例输入和输出作为minimal reproducible example 的一部分?我在您当前的代码中没有看到任何直接的警告信号 - 在这种情况下,包装函数是完全正常的。此外,推导可以替换现有列表的所有项目,而不是使用例如创建单独的列表对象。 L[:] = [f(i) for i in L].

标签: python list function python-3.x


【解决方案1】:

根据您的示例代码,您可以尝试这种方式,

func_list = [d, c, b, a]
for idx, item in enumerate(item_list):
    item_list[idx] = reduce(lambda v, func: func(v), func_list, item)

让每个func处理数据,让循环更像管道。

【讨论】:

  • 使用循环通常比使用reduce 更清晰(这就是为什么它被降级为functools):for f in func_list: item_list[idx] = f(item_list[idx])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 2013-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多