找回密码
 注册
Simdroid-非首页
查看: 174|回复: 11

[基础概念] 一句代码实现元素抽取

[复制链接]
发表于 2009-12-4 17:05:08 | 显示全部楼层 |阅读模式 来自 甘肃兰州
悬赏5仿真币已解决
  1. {{1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 2, 2, 2, 2, 2, 2}, {1, 1, 2,
  2.   2, 3, 3, 3, 3, 3}, {1, 2, 2, 3, 3, 4, 4, 4, 4}, {1, 2, 3, 4, 4, 4,
  3.   5, 5, 5}, {1, 2, 3, 4, 5, 5, 6, 6, 6}, {1, 3, 4, 5, 5, 6, 6, 7,
  4.   7}, {1, 3, 4, 5, 6, 7, 7, 8, 8}, {1, 3, 5, 6, 7, 8, 8, 9, 9}}
复制代码

对于这个表,要求找出每一行(即每一个子表)中元素数字等于所在行数的元素数目,比如说在第二个子表中有6个2,如何用一句代码实现这个目的?
发表于 2009-12-4 17:05:09 | 显示全部楼层 来自 黑龙江哈尔滨
Simdroid开发平台
本帖最后由 TBE_Legend 于 2009-12-4 19:46 编辑
restart; data := [[1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 2, 2, 2, 2, 2, 2], [1, 1, 2, 2, 3, 3, 3, 3, 3], [1, 2, 2, 3, 3, 4, 4, 4, 4], [1, 2, 3, 4, 4, 4, 5, 5, 5], [1, 2, 3, 4, 5, 5, 6, 6, 6], [1, 3, 4 ...
maplelab 发表于 2009-12-4 18:27


  1. list = {{1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 2, 2, 2, 2, 2, 2}, {1,
  2.    1, 2, 2, 3, 3, 3, 3, 3}, {1, 2, 2, 3, 3, 4, 4, 4, 4}, {1, 2, 3, 4,
  3.    4, 4, 5, 5, 5}, {1, 2, 3, 4, 5, 5, 6, 6, 6}, {1, 3, 4, 5, 5, 6, 6,
  4.    7, 7}, {1, 3, 4, 5, 6, 7, 7, 8, 8}, {1, 3, 5, 6, 7, 8, 8, 9, 9}};
  5. Table[Count[list[[i]], i], {i, Length[list]}]
复制代码
回复

使用道具 举报

发表于 2009-12-4 17:38:53 | 显示全部楼层 来自 上海

  1. data={{1,1,1,1,1,1,1,1,1},{1,1,1,2,2,2,2,2,2},{1,1,2,2,3,3,3,3,3},{1,2,2,3,3,4,4,4,4},{1,2,3,4,4,4,5,5,5},{1,2,3,4,5,5,6,6,6},{1,3,4,5,5,6,6,7,7},{1,3,4,5,6,7,7,8,8},{1,3,5,6,7,8,8,9,9}};

  2. MapIndexed[Count[#1, First@#2] &, data]

  3. StringLength["MapIndexed[Count[#1,First@#2]&,data]"]
复制代码
回复

使用道具 举报

发表于 2009-12-4 18:27:24 | 显示全部楼层 来自 湖北武汉
本帖最后由 maplelab 于 2009-12-4 21:23 编辑
  1. restart; data := [[1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 2, 2, 2, 2, 2, 2], [1, 1, 2, 2, 3, 3, 3, 3, 3], [1, 2, 2, 3, 3, 4, 4, 4, 4], [1, 2, 3, 4, 4, 4, 5, 5, 5], [1, 2, 3, 4, 5, 5, 6, 6, 6], [1, 3, 4, 5, 5, 6, 6, 7, 7], [1, 3, 4, 5, 6, 7, 7, 8, 8], [1, 3, 5, 6, 7, 8, 8, 9, 9]]:seq(nops(select(has, data, i)), i = 1 .. nops(data));
复制代码
或者:
  1. restart; data := [[1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 2, 2, 2, 2, 2, 2], [1, 1, 2, 2, 3, 3, 3, 3, 3], [1, 2, 2, 3, 3, 4, 4, 4, 4], [1, 2, 3, 4, 4, 4, 5, 5, 5], [1, 2, 3, 4, 5, 5, 6, 6, 6], [1, 3, 4, 5, 5, 6, 6, 7, 7], [1, 3, 4, 5, 6, 7, 7, 8, 8], [1, 3, 5, 6, 7, 8, 8, 9, 9]]: for i to nops(data) do nops(select(has, data, i)) end do;
复制代码
又或者:
  1. restart; data := [[1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 2, 2, 2, 2, 2, 2], [1, 1, 2, 2, 3, 3, 3, 3, 3], [1, 2, 2, 3, 3, 4, 4, 4, 4], [1, 2, 3, 4, 4, 4, 5, 5, 5], [1, 2, 3, 4, 5, 5, 6, 6, 6], [1, 3, 4, 5, 5, 6, 6, 7, 7], [1, 3, 4, 5, 6, 7, 7, 8, 8], [1, 3, 5, 6, 7, 8, 8, 9, 9]]: seq(nops(select(is, op(i, data), i)), i = 1 .. nops(data));
复制代码
回复

使用道具 举报

发表于 2009-12-4 20:20:08 | 显示全部楼层 来自 黑龙江哈尔滨
本帖最后由 TBE_Legend 于 2009-12-4 20:21 编辑
  1. ParallelTable[
  2. Count[{{1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 2, 2, 2, 2, 2, 2}, {1,
  3.      1, 2, 2, 3, 3, 3, 3, 3}, {1, 2, 2, 3, 3, 4, 4, 4, 4}, {1, 2, 3,
  4.      4, 4, 4, 5, 5, 5}, {1, 2, 3, 4, 5, 5, 6, 6, 6}, {1, 3, 4, 5, 5,
  5.      6, 6, 7, 7}, {1, 3, 4, 5, 6, 7, 7, 8, 8}, {1, 3, 5, 6, 7, 8, 8,
  6.      9, 9}}[[i]], i], {i, Length[list]}]
复制代码
回复

使用道具 举报

 楼主| 发表于 2009-12-4 21:46:21 | 显示全部楼层 来自 甘肃兰州
本帖最后由 jimogsh 于 2009-12-4 21:56 编辑

我原来希望用Select加纯函数的方法实现,却失败了。刚刚发现这样也可以:
  1. data = {{1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 2, 2, 2, 2, 2, 2}, {1,
  2.    1, 2, 2, 3, 3, 3, 3, 3}, {1, 2, 2, 3, 3, 4, 4, 4, 4}, {1, 2, 3, 4,
  3.    4, 4, 5, 5, 5}, {1, 2, 3, 4, 5, 5, 6, 6, 6}, {1, 3, 4, 5, 5, 6, 6,
  4.    7, 7}, {1, 3, 4, 5, 6, 7, 7, 8, 8}, {1, 3, 5, 6, 7, 8, 8, 9,
  5.    9}}; Table[Length[Select[data[i], # == i &]], {i, 9}]
复制代码
大家看能不能去掉那个Table函数而改用纯函数套纯函数的方法?
回复

使用道具 举报

发表于 2009-12-5 03:00:04 | 显示全部楼层 来自 美国
  1. data = {{1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 2, 2, 2, 2, 2, 2}, {1,
  2.     1, 2, 2, 3, 3, 3, 3, 3}, {1, 2, 2, 3, 3, 4, 4, 4, 4}, {1, 2, 3, 4,
  3.      4, 4, 5, 5, 5}, {1, 2, 3, 4, 5, 5, 6, 6, 6}, {1, 3, 4, 5, 5, 6,
  4.     6, 7, 7}, {1, 3, 4, 5, 6, 7, 7, 8, 8}, {1, 3, 5, 6, 7, 8, 8, 9,
  5.     9}};
  6. i = 1; Count[#, i++] & /@ data
复制代码
回复

使用道具 举报

发表于 2009-12-5 08:56:10 | 显示全部楼层 来自 黑龙江哈尔滨
本帖最后由 TBE_Legend 于 2009-12-5 09:03 编辑
我原来希望用Select加纯函数的方法实现,却失败了。刚刚发现这样也可以:data = {{1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 2, 2, 2, 2, 2, 2}, {1,
   1, 2, 2, 3, 3, 3, 3, 3}, {1, 2, 2, 3, 3, 4, 4, 4, 4}, {1, ...
jimogsh 发表于 2009-12-4 21:46


你的意思是不想要循环?这个行吗
  1. Clear["Global`*"]
  2. data = {{1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 2, 2, 2, 2, 2, 2}, {1,
  3.     1, 2, 2, 3, 3, 3, 3, 3}, {1, 2, 2, 3, 3, 4, 4, 4, 4}, {1, 2, 3, 4,
  4.      4, 4, 5, 5, 5}, {1, 2, 3, 4, 5, 5, 6, 6, 6}, {1, 3, 4, 5, 5, 6,
  5.     6, 7, 7}, {1, 3, 4, 5, 6, 7, 7, 8, 8}, {1, 3, 5, 6, 7, 8, 8, 9,
  6.     9}};
  7. Count[#, Position[data, #][[1, 1]]] & /@ data
复制代码
回复

使用道具 举报

发表于 2009-12-5 09:04:35 | 显示全部楼层 来自 黑龙江哈尔滨
你的意思是不想要循环?这个行吗 Clear["Global`*"]
data = {{1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 2, 2, 2, 2, 2, 2}, {1,
    1, 2, 2, 3, 3, 3, 3, 3}, {1, 2, 2, 3, 3, 4, 4, 4, 4}, {1, 2, 3, 4,
   ...
TBE_Legend 发表于 2009-12-5 08:56
  1. Clear["Global`*"]
  2. data = {{1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 2, 2, 2, 2, 2, 2}, {1,
  3.     1, 2, 2, 3, 3, 3, 3, 3}, {1, 2, 2, 3, 3, 4, 4, 4, 4}, {1, 2, 3, 4,
  4.      4, 4, 5, 5, 5}, {1, 2, 3, 4, 5, 5, 6, 6, 6}, {1, 3, 4, 5, 5, 6,
  5.     6, 7, 7}, {1, 3, 4, 5, 6, 7, 7, 8, 8}, {1, 3, 5, 6, 7, 8, 8, 9,
  6.     9}};
  7. g[x_List /; MemberQ[x, Position[data, x][[1, 1]]]] :=
  8. Count[x, Position[data, x][[1, 1]]]
  9. g /@ data
复制代码
回复

使用道具 举报

 楼主| 发表于 2009-12-5 12:59:01 | 显示全部楼层 来自 甘肃兰州
本帖最后由 jimogsh 于 2009-12-5 13:00 编辑

越改越麻烦了,我把我错误的代码拿出来吧
  1. data = {{1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 2, 2, 2, 2, 2, 2}, {1,
  2.    1, 2, 2, 3, 3, 3, 3, 3}, {1, 2, 2, 3, 3, 4, 4, 4, 4}, {1, 2, 3, 4,
  3.    4, 4, 5, 5, 5}, {1, 2, 3, 4, 5, 5, 6, 6, 6}, {1, 3, 4, 5, 5, 6, 6,
  4.    7, 7}, {1, 3, 4, 5, 6, 7, 7, 8, 8}, {1, 3, 5, 6, 7, 8, 8, 9, 9}};
  5. Select[data[[#]], #2 == # &] & /@ Range[9]
复制代码
我是希望能用类似的方法,用两个纯函数的,上面的代码能不能怎样改造一下实现目的?
里面的一句 #2 == # &是一个函数,它的变量是#2,而#是外面那个纯函数的变量。如何正确表达这一意思?
回复

使用道具 举报

发表于 2009-12-5 13:29:51 | 显示全部楼层 来自 美国
好像很难,可能你说的让M@混淆,可能用Cases好一点;
  1. Length@Cases[data[[#]], #] & /@ Range[9]
复制代码
回复

使用道具 举报

发表于 2009-12-5 13:45:01 | 显示全部楼层 来自 黑龙江哈尔滨
本帖最后由 TBE_Legend 于 2009-12-5 13:49 编辑
越改越麻烦了,我把我错误的代码拿出来吧data = {{1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 2, 2, 2, 2, 2, 2}, {1,
   1, 2, 2, 3, 3, 3, 3, 3}, {1, 2, 2, 3, 3, 4, 4, 4, 4}, {1, 2, 3, 4,
   4, 4, 5, 5, 5}, ...
jimogsh 发表于 2009-12-5 12:59


很不错的问题,希望高手们能关注下。mmtc怎么区分多层复合纯函数的自变量?
我投机了下,应该还有更好的办法。
  1. Clear["Global`*"]
  2. data = {{1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 2, 2, 2, 2, 2, 2}, {1,
  3.     1, 2, 2, 3, 3, 3, 3, 3}, {1, 2, 2, 3, 3, 4, 4, 4, 4}, {1, 2, 3, 4,
  4.      4, 4, 5, 5, 5}, {1, 2, 3, 4, 5, 5, 6, 6, 6}, {1, 3, 4, 5, 5, 6,
  5.     6, 7, 7}, {1, 3, 4, 5, 6, 7, 7, 8, 8}, {1, 3, 5, 6, 7, 8, 8, 9,
  6.     9}};
  7. Select[data[[#]], # == a & /. a -> #] & /@ Range[9]

复制代码
回复

使用道具 举报

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

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-29 02:06 , Processed in 0.043978 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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