将功能列表应用于列表中的每个项目?

时间:2017-03-30 04:48:42

标签: python list function python-3.x

我正在制作一个适用于聊天文件的程序,其格式如下:

  1. 打开文件&导入行(通过readlines
  2. 执行初始传递,将字符串列表转换为格式更好的数据(当前为dicts):
    • 抛出畸形线
    • 将用户名与消息文本分开
    • 为被忽略的(通常是机器人)用户抛出行
    • 标记哪些行是/me命令
  3. 对dicts列表进行第二次传递以对它们应用各种操作,例如:
    • 用别名
    • 替换每个提及的昵称
    • 将特殊格式应用于/me命令
  4. 不是在配置文件中有多个开关,而是在循环中进行了大量的if语句检查,我相信如果我在其他地方生成函数列表然后在程序中输入了dicts列表,程序会更清晰(或字符串,取决于我所在的程序的哪一部分)和一系列函数,以便将函数列表应用于对象列表中的每个项目。

    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,除非我明确添加了切换到这样做。

1 个答案:

答案 0 :(得分:0)

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

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处理数据,使循环更像管道。