Я считаю, что есть более быстрый способ, чем тот, который уже был дан, но сначала, метод Джошуа Cases
можно сделать немного быстрее, используя /;
вместо &
для теста.
Это решение, которое я предлагаю (отредактируйте: добавив пробел для ясности, поскольку здесь двойные скобки не форматируются):
dat[[
Position[
dat[[All, 2]],
x_ /; x >= 100,
1, 1
][[1, 1]],
1
]]
Вот время для различных предлагаемых методов. Обратите внимание, что метод /.
запускается только один раз, в то время как другие выполняются loops
раз. Поэтому в этом первом тесте он в 100 раз медленнее, чем метод Position
. Кроме того, метод NestWhile
возвращает только индекс, а не фактический элемент первого столбца.
In[]:=
dat = {Range[5000], Sort@RandomInteger[1*^6, 5000]} // Transpose;
lim = 300000; loops = 100;
dat /. {___, {x_, _?(# >= lim &)}, ___} :> x; // Timing
Do[ Cases[dat, {_, _?(# >= lim &)}, 1, 1][[1, 1]] , {loops}] // Timing
Do[ Cases[dat, {_, y_ /; y >= lim}, 1, 1][[1, 1]] , {loops}] // Timing
Do[ Select[dat, #[[2]] >= lim &, 1][[1, 1]] , {loops}] // Timing
Do[ NestWhile[# + 1 &, 1, dat[[#, 2]] < lim &] , {loops}] // Timing
Do[ dat[[Position[dat[[All, 2]], x_ /; x >= lim, 1, 1][[1, 1]], 1]] , {loops}] // Timing
Out[]= {0.125, Null}
Out[]= {0.438, Null}
Out[]= {0.406, Null}
Out[]= {0.469, Null}
Out[]= {0.281, Null}
Out[]= {0.125, Null}
С более длинным столом (я опускаю медленный метод):
In[]:=
dat = {Range[35000], Sort@RandomInteger[1*^6, 35000]} // Transpose;
lim = 300000; loops = 25;
Do[ Cases[dat, {_, _?(# >= lim &)}, 1, 1][[1, 1]] , {loops}] // Timing
Do[ Cases[dat, {_, y_ /; y >= lim}, 1, 1][[1, 1]] , {loops}] // Timing
Do[ Select[dat, #[[2]] >= lim &, 1][[1, 1]] , {loops}] // Timing
Do[ NestWhile[# + 1 &, 1, dat[[#, 2]] < lim &] , {loops}] // Timing
Do[ dat[[Position[dat[[All, 2]], x_ /; x >= lim, 1, 1][[1, 1]], 1]] , {loops}] // Timing
Out[]= {0.734, Null}
Out[]= {0.641, Null}
Out[]= {0.734, Null}
Out[]= {0.5, Null}
Out[]= {0.266, Null}
Наконец, подтверждение соглашения:
In[]:= SameQ[
Select[dat, #[[2]] >= lim &, 1][[1, 1]],
dat[[Position[dat[[All, 2]], x_ /; x >= lim, 1, 1][[1, 1]], 1]]
]
Out[]= True