我对如何一行一行地垂直对齐打印几个类似矩阵的嵌套列表有疑问,以便它们出现在一个在另一个的列中。
我尝试了多种方法,但都不起作用,并且我使用了多种文本格式,但它没有按预期输出。有什么建议吗?
我更新了疑问,希望现在你能理解。
(defun tabA()
'((X 0 0 0 0 0 0)
(0 0 0 X 0 0 0)
(0 0 0 0 0 0 0)
(0 0 0 T 0 0 0)
(0 0 0 0 0 0 0)))
(defun tabB()
'((0 0 0 0 X 0 0)
(0 0 0 0 0 0 0)
(0 T 0 0 0 0 0)
(0 0 0 X 0 0 0)
(0 0 0 0 0 0 0)))
(defun tabC()
'((0 0 0 T 0 0 0)
(0 0 0 0 0 0 0)
(0 0 X 0 0 X 0)
(0 0 0 0 0 0 0)
(0 0 0 0 0 0 0)))
(defun states ()
(list (tabA) (tabB) (tabC)))
(defun test-print ()
(format T "~%--- Result ---")
(mapcar #'(lambda(x) (print-state x)) (states)))
(defun print-state (x)
(format T "~%")
(mapcar (lambda (x) (format T "~@T~@T~@T~@T~@T ~A ~%" x)) x)
(format NIL ""))
;;test print
(test-print)
您可以在 ideone.com 中测试并查看结果就像这个例子
--- Result ---
(X 0 0 0 0 0 0)
(0 0 0 X 0 0 0)
(0 0 0 0 0 0 0)
(0 0 0 T 0 0 0)
(0 0 0 0 0 0 0)
(0 0 0 0 X 0 0)
(0 0 0 0 0 0 0)
(0 T 0 0 0 0 0)
(0 0 0 X 0 0 0)
(0 0 0 0 0 0 0)
(0 0 0 T 0 0 0)
(0 0 0 0 0 0 0)
(0 0 X 0 0 X 0)
(0 0 0 0 0 0 0)
(0 0 0 0 0 0 0)
我想将这些列表打印成两列或三列,就像这个例子
--- Result ---
(X 0 0 0 0 0 0) (0 0 0 0 X 0 0)
(0 0 0 X 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 T 0 0 0 0 0)
(0 0 0 T 0 0 0) (0 0 0 X 0 0 0)
(0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 T 0 0 0)
(0 0 0 0 0 0 0)
(0 0 X 0 0 X 0)
(0 0 0 0 0 0 0)
(0 0 0 0 0 0 0)
最佳答案
如果输入像示例数据中那样是常规的,则可以通过循环遍历表的行索引并循环遍历表本身以按顺序打印行来简单地完成此操作:
(defun print-tables (tables)
(let ((rows (length (first tables))))
(loop for n below rows do
(terpri)
(dolist (table tables)
(format t "~A " (elt table n))))))
print-tables
函数将表列表作为其参数。这里假设表格都是相同的形状,具有规则的列宽。计算第一个表的行数,循环计算从 0 开始的行索引,并在之前使用 (terpri)
打印换行符打印每个表行序列。 dolist
迭代tables
,并为每个表打印第n
行。相同的方法可以用于更不规则的数据,并带有一些额外的格式化代码。
SCRATCH> (print-tables (list (tabA) (tabB) (tabC)))
(X 0 0 0 0 0 0) (0 0 0 0 X 0 0) (0 0 0 T 0 0 0)
(0 0 0 X 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 T 0 0 0 0 0) (0 0 X 0 0 X 0)
(0 0 0 T 0 0 0) (0 0 0 X 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
NIL
上面的代码只是在单行表格中按顺序打印表格,但是对于大量表格,明智地对表格进行分组会很好。利用上述 print-tables
函数,可以在 print-groups
函数中编写和使用 group-tables
函数。
(defun group-tables (grouping tables)
(labels ((iter (tables group)
(cond ((null tables)
(list group))
((= (length group) grouping)
(cons group
(iter tables '())))
(t
(iter (rest tables)
(append group (list (first tables))))))))
(iter tables '())))
这里group-tables
采用一个表列表和一个整数参数来指定每个输出行所需的最大分组。本地 iter 函数构建一个组列表,但随着进展,每个组都在累加器中构建;请注意,此处使用 append
来保持表格与输入的顺序相同。
(defun print-groups (grouping tables)
(dolist (group (group-tables grouping tables))
(print-tables group)
(terpri)))
这里 print-groups
只是使用 group-tables
将表收集到组中,然后使用 dolist
挑选每个单独的组由 print-tables
函数处理。
REPL 交互示例:
SCRATCH> (print-groups 3 (list (tabA) (tabB) (tabC)))
(X 0 0 0 0 0 0) (0 0 0 0 X 0 0) (0 0 0 T 0 0 0)
(0 0 0 X 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 T 0 0 0 0 0) (0 0 X 0 0 X 0)
(0 0 0 T 0 0 0) (0 0 0 X 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
NIL
SCRATCH> (print-groups 2 (list (tabA) (tabB) (tabC)))
(X 0 0 0 0 0 0) (0 0 0 0 X 0 0)
(0 0 0 X 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 T 0 0 0 0 0)
(0 0 0 T 0 0 0) (0 0 0 X 0 0 0)
(0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 T 0 0 0)
(0 0 0 0 0 0 0)
(0 0 X 0 0 X 0)
(0 0 0 0 0 0 0)
(0 0 0 0 0 0 0)
NIL
SCRATCH> (print-groups 3 (list (tabA) (tabB) (tabC) (tabA) (tabB) (tabC)))
(X 0 0 0 0 0 0) (0 0 0 0 X 0 0) (0 0 0 T 0 0 0)
(0 0 0 X 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 T 0 0 0 0 0) (0 0 X 0 0 X 0)
(0 0 0 T 0 0 0) (0 0 0 X 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
(X 0 0 0 0 0 0) (0 0 0 0 X 0 0) (0 0 0 T 0 0 0)
(0 0 0 X 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 T 0 0 0 0 0) (0 0 X 0 0 X 0)
(0 0 0 T 0 0 0) (0 0 0 X 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
NIL
SCRATCH> (print-groups 4 (list (tabA) (tabB) (tabC) (tabA) (tabB) (tabC)))
(X 0 0 0 0 0 0) (0 0 0 0 X 0 0) (0 0 0 T 0 0 0) (X 0 0 0 0 0 0)
(0 0 0 X 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 X 0 0 0)
(0 0 0 0 0 0 0) (0 T 0 0 0 0 0) (0 0 X 0 0 X 0) (0 0 0 0 0 0 0)
(0 0 0 T 0 0 0) (0 0 0 X 0 0 0) (0 0 0 0 0 0 0) (0 0 0 T 0 0 0)
(0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 X 0 0) (0 0 0 T 0 0 0)
(0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
(0 T 0 0 0 0 0) (0 0 X 0 0 X 0)
(0 0 0 X 0 0 0) (0 0 0 0 0 0 0)
(0 0 0 0 0 0 0) (0 0 0 0 0 0 0)
NIL
关于layout - 在 Lisp 中打印列中的嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61551936/