首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么设置差异函数不能将列表与文件中的数据进行比较?

为什么设置差异函数不能将列表与文件中的数据进行比较?
EN

Stack Overflow用户
提问于 2013-04-11 22:31:54
回答 2查看 117关注 0票数 3

以下是我的文件和函数:

清单1.txt =>猫狗虎熊

List2.txt =>猫狗虎

这些文件是在winodws xp上进行ANSI编码的。

代码语言:javascript
复制
(defun get-file (filename)
  (with-open-file (stream filename)
  (loop for line = (read-line stream nil)
  while line collect line)))

(defparameter *file1* (get-file "list1.txt"))
(defparameter *file2* (get-file "list2.txt"))

(set-difference *file1* *file2*)

我认为输出应该是“熊”。但是,它返回(“猫”、“狗”、“虎”、“熊”)作为差异。我假设这是由于我从文件中读取信息,但我被困在那里了。谢谢您抽时间见我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-11 22:45:16

Common Lisp使用EQL作为默认测试。你想要string-equal或类似的东西。

代码语言:javascript
复制
CL-USER > (set-difference '("cat" "dog" "tiger" "bear")
                          '("cat" "dog" "tiger")
                          :test #'string-equal)
->
("bear")
票数 5
EN

Stack Overflow用户

发布于 2013-04-11 23:12:08

除了Rainer已经提到的set-difference:test关键字参数之外,您的代码中还有另一个问题。您的函数get-file将返回一个行列表,其中每行都是一个字符串。您可能希望将这些行拆分成单词。你可以使用split-sequence函数很容易做到这一点(谷歌搜索split-sequence Common Lisp包,或者通过

代码语言:javascript
复制
(ql:quickload :split-sequence)

如果您安装了quicklisp。因此,您的函数可能如下所示,例如:

代码语言:javascript
复制
(defun get-file (path)
  (with-open-file (s path)
    (let* ((len (file-length s))
           (data (make-string len)))
      (read-sequence data s)
      (mapcar #'(lambda (string) (string-trim '(#\Space #\Tab #\Newline) string))
        (split-sequence:split-sequence '#\Space data :remove-empty-subseqs t)))))


(defparameter *file1* (get-file "list1.txt"))
(defparameter *file2* (get-file "list2.txt"))

(format t "~s~%" (set-difference *file1* *file2* :test #'string-equal))

这将正确地打印:

代码语言:javascript
复制
("bear")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15951492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档