明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 342|回复: 13

[提问] 麻烦各位大佬写个相同项累加并排序的程序

[复制链接]
发表于 昨天 15:09 | 显示全部楼层 |阅读模式
  (setq Lst
         (list
           '("CT1" 3 0.93 0.986)
           '("CT1" 3 0.93 0.986)
           '("CT2" 3 1.008 1.065)
           '("CT1" 3 0.93 0.986)
           '("CT1" 3 0.93 0.986)
           '("CT2" 3 1.008 1.065)
           '("CT2" 3 1.008 1.065)
           '("CT2" 3 1.008 1.065)
           '("CT2" 3 1.008 1.065)
           '("CT2" 3 1.008 1.065)
           '("CJ1" 3 1.41 1.482)
           '("CJ3" 3 0.57 0.614)
           '("CJ1" 3 1.41 1.482)
           '("CJ3" 3 0.57 0.614)
           '("CJ2" 3 1.528 1.601)
           '("CJ4" 3 0.618 0.663)
           '("CJ1" 3 1.41 1.482)
           '("CJ3" 3 0.57 0.614)
           '("CJ1" 3 1.41 1.482)
           '("CJ3" 3 0.57 0.614)
           '("CJ2" 3 1.528 1.601)
           '("CJ4" 3 0.619 0.667)
           '("CJ4" 3 0.618 0.663)
         )
  )
希望返回:((CJ1 3 5.64 5.928) (CJ2 3 3.056 3.202) (CJ3 3 2.28 2.456) (CJ4 3 1.236 1.326) (CT1 3 3.72 3.944) (CT2 3 6.048 6.39))
列表如上,麻烦各位大佬帮写个第1元素相同项累加第3、4元素,然后按第1元素排序的程序,非常谢谢!

"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

发表于 昨天 15:30 | 显示全部楼层
本帖最后由 tryhi 于 2025-4-29 15:32 编辑

写完之后编辑器死机了,还好我截图下来,这是完整代码,你抄一下吧,附件是try-num-lst-flhz函数


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 1明经币 +1 收起 理由
tender138 + 1

查看全部评分

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 昨天 16:28 | 显示全部楼层
tryhi 发表于 2025-4-29 15:30
写完之后编辑器死机了,还好我截图下来,这是完整代码,你抄一下吧,附件是try-num-lst-flhz函数

(defun c:AA( / Lst a b)
  (setq Lst
         (list
           '("CT1" 3 0.93 0.986)
           '("CT1" 3 0.93 0.986)
           '("CT2" 3 1.008 1.065)
           '("CT1" 3 0.93 0.986)
           '("CT1" 3 0.93 0.986)
           '("CT2" 3 1.008 1.065)
           '("CT2" 3 1.008 1.065)
           '("CT2" 3 1.008 1.065)
           '("CT2" 3 1.008 1.065)
           '("CT2" 3 1.008 1.065)
           '("CJ1" 3 1.41 1.482)
           '("CJ3" 3 0.57 0.614)
           '("CJ1" 3 1.41 1.482)
           '("CJ3" 3 0.57 0.614)
           '("CJ2" 3 1.528 1.601)
           '("CJ4" 3 0.618 0.663)
           '("CJ1" 3 1.41 1.482)
           '("CJ3" 3 0.57 0.614)
           '("CJ1" 3 1.41 1.482)
           '("CJ3" 3 0.57 0.614)
           '("CJ2" 3 1.528 1.601)
           '("CJ4" 3 0.619 0.667)
           '("CJ4" 3 0.618 0.663)
         )
  )
  (setq
    a (mapcar '(lambda(x) (reverse (cdr (reverse x)))) Lst)
    b (mapcar '(lambda(x) (list (car x) (cadr x) (last x))) Lst)
  )
  (setq
    a (try-num-lst-flhz a)
    b (try-num-lst-flhz b)
  )
  (vl-sort (mapcar '(lambda(a b) (append a (list (last b)))) a b) '(lambda(a b) (<(car a) (car b))))
)

(defun try-num-lst-flhz (lst / assocs head num)
  (defun assocs (e lst) (mapcar 'cadr (vl-remove-if-not '(lambda(x) (equal e (car x))) lst)))
  (setq lst (mapcar '(lambda(x) (list (reverse (cdr (reverse x))) (last x))) lst));把每个子项(a b c n)转换为((a b c)n)
  (setq
    head (try-lst-move-same (mapcar 'car lst));表去重
    num (mapcar '(lambda(x) (apply '+ (assocs x lst))) head)
  )
  (mapcar 'append head (mapcar 'list num));重新合并
)

(defun try-lst-move-same (lst / s-car new)
  (while lst
    (setq s-car (car lst))
    (if(vl-position s-car new)
      nil
      (setq new (cons s-car new))
    )
    (setq lst (cdr lst))
  )
  (setq new (reverse new))
  new
)
回复 支持 反对

使用道具 举报

发表于 昨天 16:08 | 显示全部楼层
tender138 发表于 2025-4-29 15:29
谢谢!我太菜了,写不出一个完整的小程序

就是这三个函数一拼就行了
  1. (defun tt(lst / a lst1 tmp)(while lst
  2. (setq tmp  (vl-remove-if-not '(lambda (x) (= (setq a (caar lst)) (car x)))
  3.                               lst)
  4.        lst1 (cons (list        a
  5.                         (cadar tmp)
  6.                         (apply '+ (mapcar 'caddr tmp))
  7.                         (apply '+ (mapcar 'cadddr tmp)))
  8.                   lst1)
  9.        lst  (vl-remove-if '(lambda (x) (= a (car x))) lst)))
  10. (vl-sort lst1'(lambda(x y)(<(car x)(car y)))))

评分

参与人数 1明经币 +1 收起 理由
tryhi + 1 赞一个!

查看全部评分

回复 支持 反对

使用道具 举报

发表于 昨天 15:25 | 显示全部楼层
vl-remove-if vl-remove-if -not vl-sort组合一下即可
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 15:29 | 显示全部楼层
夏生生 发表于 2025-4-29 15:25
vl-remove-if vl-remove-if -not vl-sort组合一下即可

谢谢!我太菜了,写不出一个完整的小程序
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 15:42 | 显示全部楼层
tryhi 发表于 2025-4-29 15:30
写完之后编辑器死机了,还好我截图下来,这是完整代码,你抄一下吧,附件是try-num-lst-flhz函数

非常感谢大师的热心帮忙,谢谢!!!
回复 支持 反对

使用道具 举报

发表于 昨天 15:48 | 显示全部楼层
牛啤plus海哥牛啤哈~
回复 支持 反对

使用道具 举报

发表于 昨天 15:57 | 显示全部楼层
tender138 发表于 2025-4-29 15:42
非常感谢大师的热心帮忙,谢谢!!!

要不你把代码补齐发出来吧,方便后来人检索
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 16:26 | 显示全部楼层
本帖最后由 tender138 于 2025-4-29 16:27 编辑
夏生生 发表于 2025-4-29 16:08
就是这三个函数一拼就行了

非常感谢大师的热心帮忙,评分限制,明天再给你加分。谢谢!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-4-30 10:41 , Processed in 0.206766 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表