list - 过滤包含字符串模式的列表
问题描述
我需要过滤列表中包含字符串Status=ACTIVE的元素并将其保存为新列表。
稍后我还需要使用Status=STOPPED和System=Windows过滤相同的列表。
列表:
Programs=
["Process=1,System=Linux,PID=240,Program=DRMX,Status=ACTIVE",
"Process=1,System=Linux,PID=240,Program=DRMX,Status=STOPPED",
"Process=1,System=Windows,PID=240,Program=DRMX,Status=ACTIVE",
"Process=1,System=Linux,PID=242,Program=DRMX,Status=ACTIVE",
"Process=1,System=Windows,PID=242,Program=DRMX,Status=STOPPED",
"Process=1,System=Windows,PID=242,Program=DRMX,Status=ACTIVE",
"Process=1,System=Linux,PID=246,Program=DRMX,Status=ACTIVE",
"Process=1,System=Linux,PID=246,Program=DRMX,Status=STOPPED",
"Process=1,System=Linux,PID=246,Program=DRMX,Status=ACTIVE"].
想要的结果:
["Process=1,System=Linux,PID=240,Program=DRMX,Status=ACTIVE",
"Process=1,System=Windows,PID=240,Program=DRMX,Status=ACTIVE",
"Process=1,System=Linux,PID=242,Program=DRMX,Status=ACTIVE",
"Process=1,System=Windows,PID=242,Program=DRMX,Status=ACTIVE",
"Process=1,System=Linux,PID=246,Program=DRMX,Status=ACTIVE",
"Process=1,System=Linux,PID=246,Program=DRMX,Status=ACTIVE"].
和:
["Process=1,System=Windows,PID=242,Program=DRMX,Status=STOPPED"].
我找到了使用 re:run/2 和 lists:filter/2 过滤它的可能解决方案。有没有更简单快捷的方法?
Filter=fun(Acc)->
nomatch =/= re:run(Acc,"Status=ACTIVE") end.
Result=lists:filter(Filter,Programs).
溴,
达米安
解决方案
第一个可以通过
lists:filter(
fun (A) ->
lists:member("Status=ACTIVE", string:tokens(A,","))
end, Programs).
而第二个有点复杂,因为它需要验证两个条件:
lists:filter(
fun(A) ->
Tokens = string:tokens(A, ","),
lists:member("Status=STOPPED", Tokens)
andalso lists:member("System=Windows", Tokens)
end, Programs).
我不确定它是否更快,但它至少更具可读性。
推荐阅读
- java - 从文件中获取值并将它们分配给java中的数组
- c# - 需要帮助将事件按钮与文件连接起来
- c++ - 为什么用户交互会阻止qt本地事件循环中的http请求
- python - 并行化一个简单的计算
- c++ - 有人可以帮我弄清楚如何从我的代码中删除来自hackerrank的分段错误
- ios - 在 Objective-C 中使用指纹或 Face ID 进行应用内购买
- python - 在 django 中可以使用 pandas 吗?
- c - 调试器在 Visual Studio Code 中无法正常工作,它说启动:程序“不存在和 2 个其他问题
- python - 更改 x 轴比例 im matplotlib imshow?
- groovy - 在这种情况下如何使用 with 语句?