打印与表中的重复输入相对应的不同输出值?

Ros*_*ose 4 wolfram-mathematica duplicates string-search

例如,TableA:

     ID1    ID2   
     123    abc
     123    def
     123    ghi
     123    jkl
     123    mno
     456    abc
     456    jkl
Run Code Online (Sandbox Code Playgroud)

我想对123进行字符串搜索并返回所有相应的值.

    pp = Cases[#, x_List /; 
     MemberQ[x, y_String /; 
       StringMatchQ[y, ToString@p, IgnoreCase -> True]], {1}] &@TableA

    {f4@"ID2", f4@pp[[2]]}
Run Code Online (Sandbox Code Playgroud)

上面,p是输入,或123.这只返回ID2的一个值.如何获取ID2的所有值?

Leo*_*rin 7

为了补充其他解决方案,我想探索这个问题的高性能角落,即表大的情况,并且需要执行许多查询.显然,在这种情况下,某种预处理可以节省大量的执行时间.我想显示基于组合的默默无闻,但IMO优雅的解决方案DispatchReplaceList.这是一个用于说明的小表(我使用所有条目的字符串,以使其接近原始问题):

makeTestTable[nids_, nelems_] :=
  Flatten[Thread[{"ID" <> ToString@#, 
         ToString /@ Range[#, nelems + # - 1]}] & /@ Range[nids], 1]

In[57]:= (smallTable = makeTestTable[3,5])//InputForm
Out[57]//InputForm=
{{"ID1", "1"}, {"ID1", "2"}, {"ID1", "3"}, {"ID1", "4"}, {"ID1", "5"}, 
 {"ID2", "2"}, {"ID2", "3"}, {"ID2", "4"}, {"ID2", "5"}, {"ID2", "6"}, 
 {"ID3", "3"}, {"ID3", "4"}, {"ID3", "5"}, {"ID3", "6"}, {"ID3", "7"}}
Run Code Online (Sandbox Code Playgroud)

预处理步骤包括Dispatch从原始表中创建一个-ed规则表:

smallRules = Dispatch[Rule @@@ smallTable];
Run Code Online (Sandbox Code Playgroud)

然后获取(例如,"ID2")值的代码是:

In[59]:= ReplaceList["ID2", smallRules]

Out[59]= {"2", "3", "4", "5", "6"}
Run Code Online (Sandbox Code Playgroud)

这看起来不是什么大问题,但让我们转向更大的表格:

In[60]:= Length[table = makeTestTable[1000,1000]]
Out[60]= 1000000
Run Code Online (Sandbox Code Playgroud)

预处理步骤无疑需要一些时间:

In[61]:= (rules = Dispatch[Rule @@@ table]); // Timing

Out[61]= {3.703, Null}
Run Code Online (Sandbox Code Playgroud)

但我们只需要一次.现在,所有后续查询(可能除了第一个)都将近乎即时:

In[75]:= ReplaceList["ID520",rules]//Short//Timing
Out[75]= {0.,{520,521,522,523,524,525,<<988>>,1514,1515,1516,1517,1518,1519}}
Run Code Online (Sandbox Code Playgroud)

而没有预处理的方法对于此表大小需要相当大的时间:

In[76]:= Cases[table,{"ID520",_}][[All,2]]//Short//Timing
Out[76]= {0.188,{520,521,522,523,524,525,<<988>>,1514,1515,1516,1517,1518,1519}}
Run Code Online (Sandbox Code Playgroud)

我意识到这可能对原始问题来说太过分了,但是这样的任务很常见,例如当有人想要直接在Mathematica中探索从数据库导入的大型数据集时.