【问题标题】:Mathematica Lists - Search Level Two and Return Level One?Mathematica 列表 - 搜索二级和返回一级?
【发布时间】:2011-10-01 15:58:57
【问题描述】:

我需要在列表的第二级进行字符串匹配,但在第一级返回真实案例(第一级中有我需要对返回进行分类的信息)。

 First /@ GatherBy[#, #[[3]] &] &@
  Cases[#, x_List /;
   MemberQ[x, s_String /;
    StringMatchQ[s, ("*PHYSICAL EXAMINATION*"), 
     IgnoreCase -> True]], {2}] &@
  Cases[MemoizeTable["Diagnostic_table.txt"], {_, 
   11111, __}]

顶部的 GatherBy 命令只是按日期组织所有条目,所以我没有得到任何重复。然后我在诊断表中询问具有与字符串“物理检查”匹配的术语的案例。

我只需要搜索列表的第二级。如果我只搜索第一个,我不会返回所有真实案例。如果我搜索第一级和第二级,我会得到重复项(某些情况下,第一级和第二级都包含所需的字符串,因此列表的第一级和第二级都会分别返回)。

我需要在第二级搜索字符串,然后只返回包含匹配的第二级的列表的第一级。我不需要排除第二级,我只是不希望它像搜索第一级和第二级那样单独返回。

任何帮助将不胜感激!

【问题讨论】:

  • 例如,如果我在列表 {a,b,c,{x,y},d,x} 中搜索第二级的“x”,上面的函数会给我 { x,y}。我想要的是它给我 {a,b,c,{x,y},d,x}。

标签: list wolfram-mathematica pattern-matching string-matching levels


【解决方案1】:

也许是这样的?

list = {{a, b, c, {x, y}, d, x}, {a, b, c, d, x}, {{a, b, c, d}, x}}

Select[list, MemberQ[#, x, {2}] &]

输出:

{{a, b, c, {x, y}, d, x}}

更新

这也可以

Cases[list, _?(MemberQ[#, x, {2}] &)]

更新到@rose 问题(参见 cmets)

鉴于以下数据,我如何在第二级(即仅在子列表)? (我稍微修改了@rose 的例子)

rdata2={{1111113,21119,SQLDateTime[{2011,1,11,11,11,0.`}],31111,"EB/JW",1,47000,"T-510 CHEEK",{"T-510 CHEEK","No Examination, NOS"},"Text bla bla bla physical examination bla bla"},{1111114,21119,SQLDateTime[{2011,2,11,11,11,0.`}],31112,"EB/JW",1,47000,"T-510 CHEEK",{"T-510 CHEEK","P-023 PHYSICAL EXAMINATION, TECHNICIAN, NOS"},"Text bla bla bla"},
{1111115,21000,SQLDateTime[{2011,1,11,11,11,0.`}],31111,"EB/JW",1,47000,"T-510 CHEEK",{"T-510 CHEEK","P-023 physical examination, TECHNICIAN, NOS"},"Text bla bla bla physical examination bla bla"}};

(1) 一种方式(仅返回条目 1111114)

Select[rdata2, 
 MemberQ[Characters@#, 
   Flatten@{___, Characters["PHYSICAL EXAMINATION"], ___}, {2}] &]

(2) 忽略大小写(但仍在子列表中选择)

Select[rdata2,MemberQ[ToLowerCase@Characters@#,
Flatten@{___,ToLowerCase@
Characters["PHYSICAL EXAMINATION"],___},{2}]&]

(选择条目 1111114 和 1111115)

(3) 最后一个示例(选择子列表中具有“No Examining”但“No”和“Examination”之间可能有零个或多个字符的条目,并且再次出现 case忽略)

Select[rdata2, 
 MemberQ[ToLowerCase@Characters@#, 
   Flatten@Riffle[
     ToLowerCase@Characters@{"No", "Examination"}, ___, {1, -1, 
      2}], {2}] &]

(选择条目 1111113)

毫无疑问,有更有效的方法可以继续。我希望我已经正确解释了这个问题。

【讨论】:

  • 这看起来就像我在做什么,我会玩弄它,看看它是否与我的所有其他东西正确集成,然后投票给你的答案,希望如此!谢谢!
  • 嗯...所以,我尝试了list = Cases[ MemoizeTable["MasterDiagnostic_table.txt"], {_, 25749, __}]
  • (哎呀)和Select[list, MemberQ[#, "*PHYSICAL EXAMINATION*", {2}] &] 但它不返回任何东西。它应该返回五件事。是因为它是一个字符串吗?
  • 这是我正在搜索的列表之一的示例:{{1111113, 21119, SQLDateTime[{2011, 1, 11, 11, 11, 0.}], 31111, "EB/JW", 1, 047000, "T-510 CHEEK", {"T-510 CHEEK", "P-023 PHYSICAL EXAMINATION, TECHNICIAN, NOS"}, "Text bla bla bla physical examination bla bla"},{1111114, 21119, SQLDateTime[{2011, 2, 11, 11, 11, 0.}], 31112, "EB/JW", 1, 047000, "T-510 CHEEK", {"T-510 CHEEK", "P-023 PHYSICAL EXAMINATION, TECHNICIAN, NOS"}, "Text bla bla bla"}}
  • 在列表的第一级搜索我只返回第一个条目,其中"physical examination" 在条目末尾的文本中找到。我不会得到第二个条目,它“隐藏”在第二个内部列表中。
【解决方案2】:

如果我了解您的要求,您可以考虑:

dat = {{1111113, 21119, SQLDateTime[{2011, 1, 11, 11, 11, 0.`}], 
    31111, "EB/JW", 1, 47000, 
    "T-510 CHEEK", {"T-510 CHEEK", "No Examination, NOS"}, 
    "Text bla bla bla physical examination bla bla"}, {1111114, 21119,
     SQLDateTime[{2011, 2, 11, 11, 11, 0.`}], 31112, "EB/JW", 1, 
    47000, "T-510 CHEEK", {"T-510 CHEEK", 
     "P-023 PHYSICAL EXAMINATION, TECHNICIAN, NOS"}, 
    "Text bla bla bla"}, {1111115, 21000, 
    SQLDateTime[{2011, 1, 11, 11, 11, 0.`}], 31111, "EB/JW", 1, 47000,
     "T-510 CHEEK", {"T-510 CHEEK", 
     "P-023 physical examination, TECHNICIAN, NOS"}, 
    "Text bla bla bla physical examination bla bla"}};

p = 
 Position[ dat,
   _String?(StringMatchQ[#, "*PHYSICAL EXAMINATION*", IgnoreCase -> True] &),
   {2, 3}
 ];

dat[[ Union[First /@ p] ]]

【讨论】:

    猜你喜欢
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 2020-05-28
    相关资源
    最近更新 更多