乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 49|回复: 11

[编程交流] su内的数字总和

[复制链接]

49

主题

177

帖子

130

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-5 23:22:21 | 显示全部楼层 |阅读模式
我写了一个例程,让我把我画的一堆线中的数对放在一起。列表是这样的
 
((40 3.0) (40 4.0) (50 1.0) (50 3.0) (65 3.0) (65 5.0) (80 3.0) (80 10.0) (100
10.0) (100 6.0) (100 5.0))
 
我需要对该列表中所有子列表的所有第二个数字进行总和。我的目标是键入以下内容:
 
40 7
50 4
65 8
80 13
100 21
 
我认为apply或lambda命令在这里会帮助我,但我就是找不到方法。任何帮助都将不胜感激。
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-5 23:32:33 | 显示全部楼层
不确定是否可以用MAPCAR实现这一点。
  1. (setq listTemp '())
  2. (foreach subList '((40 3.0) (40 4.0) (50 1.0) (50 3.0) (65 3.0) (65 5.0) (80 3.0) (80 10.0) (100 10.0) (100 6.0) (100 5.0))
  3. (if (setq listExists (assoc (setq idList (car subList)) listTemp))
  4. (setq listTemp (subst (list idList (+ (cadr listExists) (cadr subList)))
  5.                        listExists
  6.                        listTemp))
  7. (setq listTemp (append listTemp
  8.                         (list subList)))
  9. )
  10. )

 
 
顺便问一下,我可以建议您考虑使用点对而不是列表吗?
  1. (setq listTemp '())
  2. (foreach subList '((40 . 3.0) (40 . 4.0) (50 . 1.0) (50 . 3.0) (65 . 3.0) (65 . 5.0) (80 . 3.0) (80 . 10.0) (100 . 10.0) (100 . 6.0) (100 . 5.0))
  3. (if (setq listExists (assoc (setq idList (car subList)) listTemp))
  4. (setq listTemp (subst (cons idList (+ (cdr listExists) (cdr subList)))
  5.                        listExists
  6.                        listTemp))
  7. (setq listTemp (append listTemp
  8.                         (list subList)))
  9. )
  10. )
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-5 23:38:01 | 显示全部楼层
使用点对是列表的最佳选择。
 
这是我对mapcar和lambda的修改。
 
  1. (setq l '((40 . 3.0)
  2.          (40 . 4.0)
  3.          (50 . 1.0)
  4.          (50 . 3.0)
  5.          (65 . 3.0)
  6.          (65 . 5.0)
  7.          (80 . 3.0)
  8.          (80 . 10.0)
  9.          (100 . 10.0)
  10.          (100 . 6.0)
  11.          (100 . 5.0)
  12.         )
  13. )
  14. (mapcar '(lambda (u)
  15.           (if (setq a (assoc (car u) lst))
  16.             (setq lst (subst (cons (car u) (+ (cdr a) (cdr u))) a lst))
  17.             (setq lst (cons (cons (car u) (cdr u)) lst))
  18.           )
  19.         )
  20.        (reverse l)
  21. )
回复

使用道具 举报

49

主题

177

帖子

130

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-5 23:41:20 | 显示全部楼层
 
我用了你的密码。谢谢你和塔瓦的帮助。似乎我需要详细阐述一下,以了解它是如何工作的。
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-5 23:48:37 | 显示全部楼层
不客气!我在代码中添加了一些注释,以帮助您理解它:
  1. [color=blue];initiate a new, empty list to store result sets (key + sum)[/color]
  2. (setq listTemp '())
  3. [color=blue];parse the items of input list (pairs of key and value)[/color]
  4. (foreach subList '((40 . 3.0) (40 . 4.0) (50 . 1.0) (50 . 3.0) (65 . 3.0) (65 . 5.0) (80 . 3.0) (80 . 10.0) (100 . 10.0) (100 . 6.0) (100 . 5.0))
  5. [color=blue] ;test if an element with current key was already treated (is stored in results list)[/color]
  6. (if (setq listExists (assoc (setq idList (car subList)) listTemp))
  7. [color=blue]  ;if yes, then summate current value to stored sum and replace the existing set (key + sum)[/color]
  8. (setq listTemp (subst (cons idList (+ (cdr listExists) (cdr subList)))
  9.                        listExists
  10.                        listTemp))
  11. [color=blue]  ;if not, then create a new set (key + sum) in results list[/color]
  12. (setq listTemp (append listTemp
  13.                         (list subList)))
  14. )
  15. )
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-5 23:53:35 | 显示全部楼层
类似地-可能:
 
  1. [b][color=BLACK]([/color][/b]defun c:sumlist [b][color=FUCHSIA]([/color][/b]/ d fl[b][color=FUCHSIA])[/color][/b]
  2. [b][color=FUCHSIA]([/color][/b]foreach p '[b][color=NAVY]([/color][/b][b][color=MAROON]([/color][/b]40 3.0[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]40 4.0[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]50 1.0[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]50 3.0[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]65 3.0[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]65 5.0[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]80 3.0[b][color=MAROON])[/color][/b]
  3.              [b][color=MAROON]([/color][/b]80 10.0[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]100 10.0[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]100 6.0[b][color=MAROON])[/color][/b] [b][color=MAROON]([/color][/b]100 5.0[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  4.   [b][color=NAVY]([/color][/b]setq fl [b][color=MAROON]([/color][/b]if [b][color=GREEN]([/color][/b]setq d [b][color=BLUE]([/color][/b]assoc [b][color=RED]([/color][/b]car p[b][color=RED])[/color][/b] fl[b][color=BLUE])[/color][/b][b][color=GREEN])[/color][/b]
  5.                [b][color=GREEN]([/color][/b]subst [b][color=BLUE]([/color][/b]list [b][color=RED]([/color][/b]car p[b][color=RED])[/color][/b] [b][color=RED]([/color][/b]+ [b][color=PURPLE]([/color][/b]cadr d[b][color=PURPLE])[/color][/b] [b][color=PURPLE]([/color][/b]cadr p[b][color=PURPLE])[/color][/b][b][color=RED])[/color][/b][b][color=BLUE])[/color][/b] d fl[b][color=GREEN])[/color][/b]
  6.                [b][color=GREEN]([/color][/b]cons p fl[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  7. [b][color=FUCHSIA]([/color][/b]prin1 fl[b][color=FUCHSIA])[/color][/b]
  8. [b][color=FUCHSIA]([/color][/b]prin1[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

 
 
-大卫
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 23:57:15 | 显示全部楼层
我在别处发布的另一种方法是在循环中两次使用第n个函数
 
  1. (setq x 0)
  2. (repeat (length list)
  3. (setq ans (+  (nth 1 (nth x list)) ans)) ; get double values then get 2nd value which is postion 1 as list starts at 0
  4. (setq x (+ x 1))
  5. )
回复

使用道具 举报

0

主题

301

帖子

301

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-6 00:02:28 | 显示全部楼层
注意,Tharwat的代码也可以按原样在列表中使用
稍加修改。
 
  1. (defun test ( / a lst)
  2.   (setq l '((40  3.0)
  3.             (40  4.0)
  4.             (50  1.0)
  5.             (50  3.0)
  6.             (65  3.0)
  7.             (65  5.0)
  8.             (80  3.0)
  9.             (80  10.0)
  10.             (100  10.0)
  11.             (100  6.0)
  12.             (100  5.0)
  13.            )
  14.   )
  15.   (mapcar '(lambda (u)
  16.              (if (setq a (assoc (car u) lst))
  17.                (setq lst (subst (cons (car u) (+ (cdr a) [color="red"](cadr u)[/color])) a lst))
  18.                (setq lst (cons (cons (car u) [color="red"](cadr u)[/color]) lst))
  19.              )
  20.            )
  21.           (reverse l)
  22.   )
  23. lst
  24. )   

 
然而,返回列表将是一个虚线列表:
 
  1. ((40 . 7.0) (50 . 4.0) (65 . 8.0) (80 . 13.0) (100 . 21.0))
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
358
发表于 2022-7-6 00:10:40 | 显示全部楼层
还有一个变种。
 
  1. (setq l '((40 . 3.0) (40 . 4.0) (50 . 1.0) (50 . 3.0) (65 . 3.0) (65 . 5.0) (80 . 3.0) (80 . 10.0) (100 . 10.0) (100 . 6.0) (100 . 5.0) ))
  2. (mapcar '(lambda (u)
  3.           (if (not (member (car u) lst))
  4.             (setq lst (cons (car u) lst))
  5.           )
  6.         )
  7.        l
  8. )
  9. (foreach x lst
  10. (setq sums
  11.         (cons
  12.           (cons
  13.             x
  14.             (apply
  15.               '+
  16.               (mapcar 'cdr
  17.                       (vl-remove-if-not '(lambda (u) (eq (car u) x)) l)
  18.               )
  19.             )
  20.           )
  21.           sums
  22.         )
  23. )
  24. )
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 00:12:08 | 显示全部楼层
  1. (defun addsub (lst / a b c d)
  2. (while (setq a (car lst))
  3. (setq b (cdr lst))
  4.    (while (setq c (assoc (Car a) b))
  5.      (setq a (cons (car a) (+ (cdr a) (cdr c)))
  6.     b (vl-remove c b)))
  7.    (setq d   (cons a d)
  8.   lst b))
  9. (reverse d)
  10. )

 
递归
  1. (defun _addsub (lst d / a b c d)
  2. (if lst
  3.    (progn
  4.      (setq a (car lst)
  5.     b (cdr lst)
  6.      )
  7.      (while (setq c (assoc (Car a) b))
  8. (setq a        (cons (car a) (+ (cdr a) (cdr c)))
  9.       b        (vl-remove c b)
  10. )
  11.      )
  12.      (setq d (cons a d))
  13.      (_addsub b d)
  14.    )
  15.    (reverse d)
  16. )
  17. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-11 00:44 , Processed in 0.398098 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表