1

我需要在列表的第二級進行字符串匹配,但在第一級還有真實情況(第一級信息需要對返回進行分類)。Mathematica列表 - 搜索二級和返回一級?

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

頂部的GatherBy命令只是按日期組織所有條目,所以我沒有得到任何重複。然後,我要求診斷表格中的條款與字符串「PHYSICAL EXAMINATION」匹配。

我只需要搜索列表的第二層。如果我只搜索第一個,我不會返回所有真實的案例。如果我搜索第一個和第二個,則會得到重複項(某些情況下,第一個和第二個級別都包含所需的字符串,因此列表的第一個和第二個級別都會單獨返回)。

我需要在第二級搜索字符串,然後僅返回包含匹配第二級的列表的第一級。我不需要排除第二級,我只是不希望它單獨返回,就像我搜索一級和二級。

任何幫助將不勝感激!

+0

例如,如果我搜索列表{A,B,C,{X,Y},d,X}爲 「×」在第二級,上面的函數會給我{x,y}。我想要的是給它{a,b,c,{x,y},d,x}。 – Rose

回答

3

也許這樣的事?

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問題(見註釋)

鑑於以下數據我如何可以選擇其中包含單詞「體格檢查」的字符串中,例如在字符串中的「P-023體格檢查條目,技術員,NOS「,在第二級(即只在子列表內)?(我已經修改@玫瑰的例子有點)

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[[email protected]#, 
    [email protected]{___, Characters["PHYSICAL EXAMINATION"], ___}, {2}] &] 

(2)忽略大小寫(但子列表中仍然選擇)

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

(選擇條目1111114 & 1111115)

(3)最後一個例子(選擇了「不考試」條目子列表內,但其中可存在之間的「否」和「檢驗」 零個或多個字符,並且其中殼體被再次忽略)

Select[rdata2, 
MemberQ[[email protected]@#, 
    [email protected][ 
    [email protected]@{"No", "Examination"}, ___, {1, -1, 
     2}], {2}] &] 

(選擇用於條目1111113 )

毫無疑問,更有效的方法來進行。我希望我已經正確地解釋了這個問題。

+0

這看起來像我什麼,我會玩弄它,看看它是否與我的其他東西正確整合,然後投票答覆你的答案,希望!謝謝! – Rose

+0

嗯...所以,我試過'list = Cases [ MemoizeTable [「MasterDiagnostic_table.txt」],{_,25749,__}]' – Rose

+0

(Oops)和'Select [list,MemberQ [#,「* PHYSICAL考試*「,{2}]&]'但它不返回任何內容。它應該返回五件事。這是因爲它是一個字符串嗎? – Rose

0

如果我理解你的要求,你可以考慮:

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] ]]