kingerst 发表于 2014-3-11 13:41:37

求助,关于表相同元素处理。

本帖最后由 雪山飞狐_lzh 于 2014-9-13 22:35 编辑

下表TT 里 有重复的元素。我需要将重复元素前面添加数字符来区分。请高手帮帮。多谢!!!!
(setqtt (list "1" "2" "3" "4" "5" "1" "2" "3" ))
(list "Ⅰ1" "Ⅰ2" "Ⅰ3" "4" "5" "Ⅱ1" "Ⅱ2" "Ⅱ3" )

ashleytgg 发表于 2014-4-30 13:31:55

;;开始study
(defun test (tt / n n_1 n_2 lst_1 I J tang tang_1)
(setq        n   (length tt)
        n_1   0
        lst_1 tt
)
(while (< n_1 n)
    (if        (not (listp (nth n_1 lst_1) ))
      ;;(listp 元素)判断元素是否为串
      (progn
        (setq a_1 (nth n_1 lst_1))
        (setq n_2 (+ n_1 1)
              I          0
        )
        ;;求单个元素的最大次数I
        (while (< n_2 n)
          (setq a_2 (nth n_2 tt))
          (if (= a_2 a_1)
          (progn
              (setq I (+ I 1))
          )
          )
          (setq n_2 (+ n_2 1))
        )                                ;(while (< n_2 n) 函数结束
        (setq lst_1 (subst (list a_1 0 I) a_1 lst_1))

        ;;下面处理单个元素的次数
        (setq n_2 (+ n_1 1)
              J          0
        )
        (while (< n_2 n)
          (setq a_2 (nth n_2 tt))
          (if (= a_2 a_1)
          (progn
              (setq J       (+ J 1)
                  tang lst_1
              )
              ;;处理元素a_2 以后的数列
              (repeat (+ n_2 1)                ;(setq n_2 5j 0)
                (setq tang (cdr tang))
              )
              (setq tang (cons (list a_1 J I) tang))
              (setq tang_2 (reverse lst_1))
              ;;处理元素a_2 以前的数列
              (repeat (- n n_2)
                (setq tang_2 (cdr tang_2))
              )
              (setq tang_2 (reverse tang_2))
              (setq lst_1 (append tang_2 tang))
          )
          )
          (setq n_2 (+ n_2 1))
        )
        ;;处理单个元素的次数函数结束
      )
    )
    ;;(if (= (length (nth n_1 lst_1)) 1) 函数结束
    (setq n_1 (+ n_1 1))
)                                        ;(while (< n_1 n) 函数结束



;;下面对变换后的数组lst_1 进行处理
;;( setq instead lst_1)(setq lst_1 instead )   
(setq        n   (length lst_1)
        n_1 0
        a_1 nil
)
(while (< n_1 n)
    ;; (setq n_1 3)
    (setq a_1 (nth n_1 lst_1))
    (cond
      ((= (caddr a_1) 0)
       (setq lst_1 (subst (car a_1) a_1 lst_1))
      )
      (t
       (setq b(change_number(cadr a_1) ))
       (setq b (strcat   b(car a_1)))
       (setq lst_1 (subst b a_1 lst_1))
      )
    )
    (setq n_1 (+ n_1 1))
)
;;(while (< n_1 n) 函数结束
lst_1
)
;; ( test tt )
;;(ascii "Ⅰ") (setq fun "chinaⅠtang") (vl-string-position 162 fun)



;;下面函数建立(0-10)整数 和小写字母的联系
(defun connect        (number / n_1 n lst_1 lst_2 lst string)
(setq        lst_1 (list (list 1 "一")
                  (list 2 "二")
                  (list 3 "三")
                  (list 4 "四")
                  (list 5 "五")
              )
        lst_2 (list (list 6 "六")
                  (list 7 "七")
                  (list 8 "八")
                  (list 9 "九")
                  (list 0 "零")
              )
        lst   (append lst_1 lst_2)
        n   (length lst)
        T_1   t
        n_1   0
)
(while (and (< n_1 n) T_1)
    (setq a_1 (car (nth n_1 lst)))
    (if        (= number a_1)
      (setq string (cadr (nth n_1 lst))
          T_1           nil
      )
    )
    (setq n_1 (+ n_1 1))
)
string
)
;;connenct 函数结束   (connect 5)

;;下面把整数转换成字符串
;; (setq num 12798)
(defun change_number (num / n_1 module t_1 a_2 a_1 lst lst_1 lst_2 value )
(setq        module 10
        t_1 t
        lstnil
        lst_1 nil
)
(while t_1
    (setq a_2 (rem num module)
          a_1 (- num a_2)
          
    )
    (if        (> a_1 0)
      (setq t_1           t
          module (* module 10)
          lst           (cons   a_2lst)
      )
      (setq t_1 nil)
    )
)
;;while t_1 函数结束
(setq lst (cons num lst))
(setq lst (reverse lst))
;;对数组取整数
(setq n_1 1
        lst_1 (cons (car lst) lst_1)
       )
(while (< n_1 (length lst))
    (setq a_1 (nth (- n_1 1) lst)
          a_2 (nth n_1 lst)
    )
    (setq a_3 (/ (- a_2 a_1) (expt 10 n_1)))
    (setq lst_1 (cons a_3   lst_1))
    (setq n_1 (+ n_1 1))
)
;;换算成小写字母
(setq lst_2 (mapcar '(lambda (x) (connect x)) lst_1))
(setq value "")
   (setq lst_2 (reverse lst_2))
(foreach try lst_2
    (setq value (strcat try value))
)
value
)
;; (change_number 7860904)

xyp1964 发表于 2014-4-30 13:49:07


(defun c:tt ()
(setq tt (list "1" "2" "3" "4" "5" "1" "2" "3")
      lst '()
)
(foreach a tt
    (if (member a lst)
      (setq a (strcat "Ⅱ" a))
    )
    (setq lst (cons a lst))
)
(setq lst (reverse lst))
)

我爱lisp 发表于 2014-5-11 22:17:04

好玩,老猫也有不明白的地方
页: [1]
查看完整版本: 求助,关于表相同元素处理。