免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4757 | 回复: 11

[数值计算] 从数组中取最接近已知数的元素 [复制链接]

论坛徽章:
0
发表于 2019-06-04 13:59 |显示全部楼层
请教各路大神:
set a = ( 37  39.1 39.2 41 )
set b = 38.3
如何通过脚本在 a数组中取得与b最接近的值呢?(最好帮忙用shell脚本)

论坛徽章:
0
发表于 2019-06-05 00:10 |显示全部楼层
回复 1# 21002700

1

论坛徽章:
0
发表于 2019-06-05 00:11 |显示全部楼层
  1. #!/usr/bin/awk -f
  2. #

  3. BEGIN{
  4.   a="37 39.1 39.2 41"
  5.   b=38.3

  6.   split(a,c," ")
  7.   for(i in c)
  8.     b>c[i]?d[b-c[i]]=c[i]:d[c[i]-b]=c[i]

  9.   PROCINFO["sorted_in"]="@ind_num_asc"
  10.   for(i in d){
  11.     print d[i]
  12.     exit
  13.   }
  14. }

  15. ./test.awk
  16. 39.1
复制代码

论坛徽章:
0
发表于 2019-06-05 12:45 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2019-06-05 12:53 |显示全部楼层
  1. #!/usr/bin/awk -f
  2. #

  3. BEGIN{
  4.   a="37 39.1 39.2 41"
  5.   b=38.3
  6.   split(a,c," ")
  7.   
  8.   for(i in c)
  9.     b>c[i]?d[b-c[i]]=c[i]:d[c[i]-b]=c[i]

  10.   PROCINFO["sorted_in"]="@ind_num_asc"
  11.   for(i in d){
  12.     print d[i]
  13.     exit
  14.   }
  15. }
复制代码

论坛徽章:
8
2016科比退役纪念章
日期:2018-10-24 08:24:0115-16赛季CBA联赛之北控
日期:2019-03-12 14:34:562016科比退役纪念章
日期:2019-04-01 10:33:0915-16赛季CBA联赛之山东
日期:2019-04-17 12:46:3215-16赛季CBA联赛之广夏
日期:2019-05-09 16:40:4015-16赛季CBA联赛之广夏
日期:2019-10-10 15:33:4015-16赛季CBA联赛之辽宁
日期:2019-10-15 08:37:0615-16赛季CBA联赛之北控
日期:2021-03-30 15:53:34
发表于 2019-06-05 13:01 |显示全部楼层
  1. #!/usr/bin/python3
  2. a = [37,39.1, 39.2, 41]
  3. b = 38

  4. d = [abs(i-b) for i in a]
  5. res= [a[i] for i,k in enumerate(d) if k==min(d)]
  6. for i in res:
  7.     print(i)
复制代码

论坛徽章:
0
发表于 2019-06-05 17:46 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2019-06-12 14:14 |显示全部楼层
感谢各位大神的热情指导,谢谢

论坛徽章:
0
发表于 2019-06-12 16:27 |显示全部楼层
回复 6# cfwyy

cfwyy
大概感觉原理是找到数组与给定值的最小差异,再找到对应的数组中的值,res= [a for i,k in enumerate(d) if k==min(d)]
这一段能具体讲解一下吗,小弟平时只会写cshell,


论坛徽章:
8
2016科比退役纪念章
日期:2018-10-24 08:24:0115-16赛季CBA联赛之北控
日期:2019-03-12 14:34:562016科比退役纪念章
日期:2019-04-01 10:33:0915-16赛季CBA联赛之山东
日期:2019-04-17 12:46:3215-16赛季CBA联赛之广夏
日期:2019-05-09 16:40:4015-16赛季CBA联赛之广夏
日期:2019-10-10 15:33:4015-16赛季CBA联赛之辽宁
日期:2019-10-15 08:37:0615-16赛季CBA联赛之北控
日期:2021-03-30 15:53:34
发表于 2019-06-13 09:03 |显示全部楼层
本帖最后由 cfwyy 于 2019-06-13 09:08 编辑

回复 9# 21002700
python 入门简单的,找本教材看几天就了解了。
首先 数组在python里可以简单的用列表来代替了(其实python里也有数组,和列表不完全一样的)
d是差值的绝对值组成的列表。

  1. res= [a[i] for i,k in enumerate(d) if k==min(d)]
复制代码

和前面生成的d一样,是列表推导式生成的一个列表。
其中enumerate()函数是python内建函数,参数是可迭代对象,利用它可以同时获得索引和对应的值,它返回的是一个enumerate对象,如果把这个对象用list()生成一个列表的话,这个列表就形如:[(0,value1),(1,value2),(2,value3)...],enumerate对象在for循环里可以直接用来迭代不需要事先生成列表。
所以  当d中的值为最小值时,i是其对应的索引,也是原来数组a中的索引,res就是满足条件的所有元素组成的列表。最后迭代打印出来即可。其实很简单,可能解释的不是很清楚,见谅
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP