Mathematica - элементы StringMatch внутри списка? - PullRequest
2 голосов
/ 30 июня 2011

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

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 для каждого случая, возвращаемого первой функцией, но я не знаю, как искать в списках, не составляя им все одну строку, и возвращать результат для каждого списка.

1 Ответ

1 голос
/ 30 июня 2011

Ну, вы, вероятно, хотите 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}

...