在 Common Lisp 中对列表列表进行排序
Sorting a list of lists in Common Lisp
我正在尝试编写一些函数来对此类列表进行排序:
((1 A) (2 E) (4 D))
我在 Common Lisp 中找到了内置函数 sort,但我无法如愿。
这应该是结果:
'((1 A) (4 D) (2 E))
我想按每个列表的第二个元素按字母顺序对列表进行排序。
这是我所做的:
(sort '((1 A) (4 D) (2 E)) #'char-lessp :key #'second)
无论如何,我会理解如何使用 :key' 对具有特定功能的列表进行排序。
谢谢。
你应该使用:
(sort '((1 A) (4 E) (2 D)) #'string<= :key #'second)
原因是char-lessp
比较的是字符,而A
、E
、D
不是字符,而是符号。函数string<
可以用来比较它们的名字,即字符串"A"
、"E"
和"D"
。例如:
CL-USER> (string= 'symbol "SYMBOL")
T
CL-USER> (symbol-name 'symbol)
"SYMBOL"
请注意,字符串比较运算符有两个版本,用于区分大小写和不区分大小写的比较:
CL-USER> (string= "a" "A")
NIL
CL-USER> (string-equal "a" "A")
T
CL-USER> (string= 'a "a")
NIL
CL-USER> (string-equal 'a "a")
T
我正在尝试编写一些函数来对此类列表进行排序:
((1 A) (2 E) (4 D))
我在 Common Lisp 中找到了内置函数 sort,但我无法如愿。
这应该是结果:
'((1 A) (4 D) (2 E))
我想按每个列表的第二个元素按字母顺序对列表进行排序。
这是我所做的:
(sort '((1 A) (4 D) (2 E)) #'char-lessp :key #'second)
无论如何,我会理解如何使用 :key' 对具有特定功能的列表进行排序。
谢谢。
你应该使用:
(sort '((1 A) (4 E) (2 D)) #'string<= :key #'second)
原因是char-lessp
比较的是字符,而A
、E
、D
不是字符,而是符号。函数string<
可以用来比较它们的名字,即字符串"A"
、"E"
和"D"
。例如:
CL-USER> (string= 'symbol "SYMBOL")
T
CL-USER> (symbol-name 'symbol)
"SYMBOL"
请注意,字符串比较运算符有两个版本,用于区分大小写和不区分大小写的比较:
CL-USER> (string= "a" "A")
NIL
CL-USER> (string-equal "a" "A")
T
CL-USER> (string= 'a "a")
NIL
CL-USER> (string-equal 'a "a")
T