如何为所有RID与QID组合调用固定第三个参数的Clojure函数?
解决方法:生成笛卡尔积遍历所有组合
既然你已经有了可以正常运行的times-changed-answer函数,现在要覆盖所有用户和所有问题的组合,最直接的方式就是生成rid和qid的笛卡尔积(也就是每个rid和每个qid都配对一次),然后对每一对调用你的函数。在Clojure里,用for或者doseq就能轻松实现这个需求,具体看你是否需要保存结果还是只执行副作用操作。
1. 保存所有结果到序列中
如果你需要把每个组合的统计结果存下来方便后续处理,可以用for推导式生成包含所有结果的序列:
;; 先定义你的固定参数和列表 (def rid-list '(1 2 4 5 10)) (def qid-list '(166 167 168 169 180 141)) (def fixed-csv-file "your-fixed-path.csv") ; 替换成你的实际CSV路径 ;; 生成所有组合并调用函数,结果以map形式存储(方便查看对应关系) (def all-change-counts (for [rid rid-list qid qid-list] {:user-id rid :question-id qid :answer-change-times (times-changed-answer rid qid fixed-csv-file)}))
这样all-change-counts里会包含每个用户-问题对的统计结果,比如其中一个元素可能是{:user-id 1, :question-id 166, :answer-change-times 2},清晰直观。
2. 直接执行副作用(比如打印、写入文件)
如果你的函数不需要返回结果存储,而是要直接做一些副作用操作(比如打印结果到控制台,或者写入到输出文件),那就用doseq代替for——doseq专门用来处理需要执行副作用的遍历场景:
(doseq [rid rid-list qid qid-list] ;; 这里可以替换成你需要的副作用操作 (println (format "用户[%d] 问题[%d] 的答案修改次数:%d" rid qid (times-changed-answer rid qid fixed-csv-file))))
运行这段代码后,控制台会输出每个用户-问题对的统计结果。
3. 可选:对结果进行分组
如果后续需要按用户或者按问题来查看统计结果,可以用group-by对生成的结果序列进行分组:
;; 按用户ID分组,每个用户对应所有问题的统计结果 (def counts-by-user (group-by :user-id all-change-counts)) ;; 按问题ID分组,每个问题对应所有用户的统计结果 (def counts-by-question (group-by :question-id all-change-counts))
比如你想查看用户1的所有问题修改次数,直接取(counts-by-user 1)就能得到对应的列表。
内容的提问来源于stack exchange,提问作者Marco Grassi
相关产品推荐
相关产品推荐

