忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT 视频 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 23840 | 回复: 7

[练习] 数据分组 [复制链接]

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2013-12-01 04:35 |显示全部楼层
本帖最后由 rubyish 于 2013-12-01 01:19 编辑

问题:
有一组数据:

1   A   6
1   B   4
1   P   3.5
1   A   5
1   P   4
1   P   4
1   A   4
1   P   4
2   P   3.5
2   A   3.5
2   A   3
2   B   3.5
2   P   3.2
2   B   3.4
2   P   3.1
2   P   3.6

按第一列分组找到所有含有P的行并且找到往上数最近的A和B
(如果没有找到,则赋空值),数据输出如下:

1   P  3.5    6    4
1   P  4       5    4
1   P  4       5    4
1   P  4       4    4
2   P  3.5      
2   P  3.2    3    3.5
2   P  3.1    3    3.4
2   P  3.6    3    3.4

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2014-01-20 03:09 |显示全部楼层
v1:~
  1. #!/usr/bin/ruby -w

  2. hAB = Hash.new {|h, k| h[k] = {} }
  3. DATA.each do |l|
  4.   k, abp, v = l.split
  5.   if abp == ?P
  6.     puts [k, abp, v, hAB[k][?A], hAB[k][?B]] * ?\t
  7.   else
  8.   hAB[k][abp] = v
  9.   end
  10. end

  11. __END__
  12. 1   A   6
  13. 1   B   4
  14. 1   P   3.5
  15. 1   A   5
  16. 1   P   4
  17. 1   P   4
  18. 1   A   4
  19. 1   P   4
  20. 2   P   3.5
  21. 2   A   3.5
  22. 2   A   3
  23. 2   B   3.5
  24. 2   P   3.2
  25. 2   B   3.4
  26. 2   P   3.1
  27. 2   P   3.6
复制代码

论坛徽章:
31
CU大牛徽章
日期:2013-03-13 15:15:08CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-09-18 15:16:55CU大牛徽章
日期:2013-09-18 15:18:22CU大牛徽章
日期:2013-09-18 15:18:43CU十二周年纪念徽章
日期:2013-10-24 15:41:34丑牛
日期:2013-12-01 10:11:07水瓶座
日期:2014-01-15 08:47:25
发表于 2014-01-21 21:38 |显示全部楼层
  1. hAB = Hash.new {|h, k| h[k] = {} }
复制代码
lz这行代码是表示Hash的值是Hash?
  1. h[k] = {}
复制代码
奇怪。。

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2014-01-22 00:46 |显示全部楼层
是Hash~
try
  1. #!/usr/bin/ruby -w
  2. hAB = Hash.new {|h, k| h[k] = {} }
  3. DATA.each do |l|
  4.   k, abp, v = l.split
  5.   unless abp == ?P
  6.     hAB[k][abp] = v
  7.     p hAB
  8.   end
  9. end

  10. __END__
  11. 1   A   6
  12. 1   B   4
  13. 1   P   3.5
  14. 1   A   5
  15. 1   P   4
  16. 1   P   4
  17. 1   A   4
  18. 1   P   4
  19. 2   P   3.5
  20. 2   A   3.5
  21. 2   A   3
  22. 2   B   3.5
  23. 2   P   3.2
  24. 2   B   3.4
  25. 2   P   3.1
  26. 2   P   3.6
复制代码
{"1"=>{"A"=>"6"}}
{"1"=>{"A"=>"6", "B"=>"4"}}
{"1"=>{"A"=>"5", "B"=>"4"}}
{"1"=>{"A"=>"4", "B"=>"4"}}
{"1"=>{"A"=>"4", "B"=>"4"}, "2"=>{"A"=>"3.5"}}
{"1"=>{"A"=>"4", "B"=>"4"}, "2"=>{"A"=>"3"}}
{"1"=>{"A"=>"4", "B"=>"4"}, "2"=>{"A"=>"3", "B"=>"3.5"}}
{"1"=>{"A"=>"4", "B"=>"4"}, "2"=>{"A"=>"3", "B"=>"3.4"}}

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2014-01-22 00:46 |显示全部楼层
是Hash~
try
  1. #!/usr/bin/ruby -w
  2. hAB = Hash.new {|h, k| h[k] = {} }
  3. DATA.each do |l|
  4.   k, abp, v = l.split
  5.   unless abp == ?P
  6.     hAB[k][abp] = v
  7.     p hAB
  8.   end
  9. end

  10. __END__
  11. 1   A   6
  12. 1   B   4
  13. 1   P   3.5
  14. 1   A   5
  15. 1   P   4
  16. 1   P   4
  17. 1   A   4
  18. 1   P   4
  19. 2   P   3.5
  20. 2   A   3.5
  21. 2   A   3
  22. 2   B   3.5
  23. 2   P   3.2
  24. 2   B   3.4
  25. 2   P   3.1
  26. 2   P   3.6
复制代码
{"1"=>{"A"=>"6"}}
{"1"=>{"A"=>"6", "B"=>"4"}}
{"1"=>{"A"=>"5", "B"=>"4"}}
{"1"=>{"A"=>"4", "B"=>"4"}}
{"1"=>{"A"=>"4", "B"=>"4"}, "2"=>{"A"=>"3.5"}}
{"1"=>{"A"=>"4", "B"=>"4"}, "2"=>{"A"=>"3"}}
{"1"=>{"A"=>"4", "B"=>"4"}, "2"=>{"A"=>"3", "B"=>"3.5"}}
{"1"=>{"A"=>"4", "B"=>"4"}, "2"=>{"A"=>"3", "B"=>"3.4"}}

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2014-01-22 01:05 |显示全部楼层
or
  1. #!/usr/bin/ruby -w
  2. hAB = {}
  3. key = "xyz"

  4. DATA.each do |l|
  5.   k, abp, v = l.split
  6.   key, hAB = k, {} if k != key
  7.   if abp == ?P
  8.     puts [k, abp, v, hAB[?A], hAB[?B]] * ?\t
  9.   else
  10.     hAB[abp] = v
  11.   end
  12. end

  13. __END__
  14. 1   A   6
  15. 1   B   4
  16. 1   P   3.5
  17. 1   A   5
  18. 1   P   4
  19. 1   P   4
  20. 1   A   4
  21. 1   P   4
  22. 2   P   3.5
  23. 2   A   3.5
  24. 2   A   3
  25. 2   B   3.5
  26. 2   P   3.2
  27. 2   B   3.4
  28. 2   P   3.1
  29. 2   P   3.6
复制代码

论坛徽章:
31
CU大牛徽章
日期:2013-03-13 15:15:08CU大牛徽章
日期:2013-05-20 10:46:18CU大牛徽章
日期:2013-05-20 10:46:25CU大牛徽章
日期:2013-05-20 10:46:31CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-09-18 15:16:55CU大牛徽章
日期:2013-09-18 15:18:22CU大牛徽章
日期:2013-09-18 15:18:43CU十二周年纪念徽章
日期:2013-10-24 15:41:34丑牛
日期:2013-12-01 10:11:07水瓶座
日期:2014-01-15 08:47:25
发表于 2014-01-27 14:48 |显示全部楼层
rubyish 发表于 2014-01-22 00:46
是Hash~
try{"1"=>{"A"=>"6"}}
{"1"=>{"A"=>"6", "B"=>"4"}}


在学习ruby时,我常常被java的编程思想影响,编写代码又有c的编程习惯。

唉。。

论坛徽章:
1
2015年亚洲杯之巴林
日期:2015-03-18 10:46:12
发表于 2015-06-21 17:07 |显示全部楼层
学习, 看不太懂
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP