Mathematica — элементы StringMatch в списке?

У меня есть функции, которые возвращают случаи из таблицы, соответствующие определенным строкам. Как только я получу все случаи, соответствующие этим строкам, мне нужно найти в каждом случае (который представляет собой отдельный список) определенные строки и выполнить команду What. Но все, что я умею делать, это превращать весь большой список списков в одну строку, и тогда я получаю только один результат (когда мне нужен результат для каждого случая).

UC@EncodeTable;

 EncodeTable[id_?PersonnelQ, f___] :=
  Cases[#, 
   x_List /; 
   MemberQ[x, 
   s_String /; 
   StringMatchQ[
    s, ("*ah*" | "*bh*" | "*gh*" | "*kf*" | 
      "*mn*"), IgnoreCase -> True]], {1}] &@
   Cases[MemoizeTable["PersonnelTable.txt"], {_, id, __}]

Эта функция возвращает случаи из таблицы

Which[(StringMatchQ[
 ToString@
  EncodeTable[11282], ("*bh*" | "*ah*" | 
   "*gh*" ), IgnoreCase -> True]) == True, 1, 
 (StringMatchQ[
 ToString@
   EncodeTable[11282], ("*bh*" | "*ah*" | 
   "*gh*" ), IgnoreCase -> True]) == False, 0]

Эта функция ДОЛЖНА возвращать 1 или 0 для каждого случая, возвращаемого первой функцией, но я не знаю, как искать в списках, не делая их все одной строкой и возвращая результат для каждого списка.


person Rosie    schedule 30.06.2011    source источник


Ответы (1)


Ну, вы, вероятно, хотите Map, но трудно сказать, не видя, какова структура данных, с которыми нужно работать. Возможно, вы можете привести пример.

РЕДАКТИРОВАТЬ: В комментарии пример результата был приведен как

dat = {{204424, 11111, SQLDateTime[{1989, 4, 4, 0, 0, 0.}], Null, 
"Parthom, Mary, MP", Null, 4147, 
"T-00010 AH BH UI", {"T-00010 AH BH UI", "M-14007 LL GG", 
 "F-Y3710 AH LL UI GG"}, "REMOVED."}, {2040, 11111, 
SQLDateTime[{1989, 4, 13, 0, 1, 0.}], Null, "KEVIN, Stevens, STK",
 Null, 81238, 
"T-00010 ah gh mn", {"T-00010 mn", "M-00100 dd", "P-02320 sd", 
 "M-14003 ed", "T-Y8800 kf", "kj"}}};

(на самом деле в примере была синтаксическая ошибка, поэтому я исправил ее, как я надеюсь, правильно).

Теперь, если я определяю функцию

func = Which[(StringMatchQ[#[[8]], ("*bh*" | "*ah*" | "*gh*"), 
   IgnoreCase -> True]) == True, 1, True, 0] &;

(обратите внимание, что второе условие для соответствия может быть записано как True, см. документацию Which), что делает это

func[dat[[1]]]
(*
-> 1
*)

(обратите внимание, что я немного изменил func по сравнению с тем, что у вас есть, чтобы он делал то, что, как я предполагаю, вы действительно хотели). Затем это можно применить к dat, элементы которого имеют форму, которую вы дали, следующим образом:

Map[func, dat]

(* -> {1, 1} *) Я не уверен, что это то, что вы хотите, я сделал все возможное, чтобы догадаться.

EDIT2: В ответ на комментарий о том, что позиция элемента, который должен быть сопоставлен, является переменной, вот один из способов:

ClearAll[funcel]
funcel[p_String] := 
  Which[StringMatchQ[p, ("*bh*" | "*ah*" | "*gh*"), 
   IgnoreCase -> True], 1, True, 0];
funcel[___] := 0;

ClearAll[func];
func[lst_List] := Which[MemberQ[Map[funcel, lst], 1], 1, True, 0]

так что

Map[func, dat]

дает {1,1}

person acl    schedule 30.06.2011
comment
{{204424, 11111, SQLDateTime[{1989, 4, 4, 0, 0, 0.}], Null, Parthom, Mary, MP, Null, 4147, T-00010 AH BH UI, {T-00010 AH BH UI , M-14007 LL GG, F-Y3710 AH LL UI GG}, REMOVED.}, {2040, 11111, SQLDateTime[{1989, 4, 13, 0, 1, 0.}], Null, KEVIN, Stevens, STK , Null, 81238, T-00010 ah gh mn, {T-00010 mn, M-00100 dd, P-02320 sd, M-14003 ed, T-Y8800 kf, kj}} - person Rosie; 30.06.2011
comment
Это будет небольшой примерный список, возвращаемый первой функцией. Мне просто нужно по одному результату от каждого последнего, так что пример должен вернуть два результата (например, 1,1). - person Rosie; 30.06.2011
comment
Спасибо! Есть ли способ выполнить StringMatchQ для нескольких элементов? Нравится {8,9}? - person Rosie; 30.06.2011
comment
@ Рози, вы имеете в виду, что вы можете получить, например, 1, если какой-либо из элементов совпадает, 0, если ни один из них не соответствует? - person acl; 30.06.2011
comment
Да, я хочу вернуть одно и то же, я просто хотел бы проверять несколько мест в каждом списке, поскольку в некоторых списках разное количество элементов. - person Rosie; 30.06.2011