1

リストの第 2 レベルで文字列一致を行う必要がありますが、第 1 レベルで真のケースが返されます (第 1 レベルには、返品を分類する必要がある情報があります)。

 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」という文字列に一致する用語を持つ診断テーブル内のケースを尋ねます。

リストの第 2 レベルのみを検索する必要があります。最初だけを検索すると、すべての真のケースが返されるわけではありません。1 番目と 2 番目を検索すると、重複が得られます (場合によっては、1 番目と 2 番目のレベルの両方に目的の文字列が含まれているため、リストの 1 番目と 2 番目のレベルの両方が別々に返されます)。

2 番目のレベルで文字列を検索し、一致した 2 番目のレベルを含むリストの最初のレベルのみを返す必要があります。レベル 1 と 2 を検索した場合のように、2 番目のレベルを除外する必要はありません。

どんな助けでも大歓迎です!

4

2 に答える 2

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 の質問への更新 (コメントを参照)

次のデータが与えられた場合、文字列内に「PHYSICAL EXAMINATION」という単語を含むエントリを選択するにはどうすればよいですか。 ? (@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 Examination」を含むが、「No」と「Examination」の間に0 文字以上の文字があり、大文字と小文字が区別されないエントリを選択)

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

(エントリ 1111113 を選択)

もっと効率的な方法があることは間違いありません。質問を正しく解釈したことを願っています。

于 2011-07-08T23:30:20.823 に答える
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] ]]
于 2011-08-18T01:45:39.977 に答える