1. Какой разумнее выбирать раздел для подобных тем?
Тут нет консенсуса, я считаю более подходящим CS (потому что
математики не наблюдаю, только
вычисления), модератор - этот (потому что вычисления
математические). Прав - он. По определению.
Нельзя ли распаковывать строку одной командой?
Получить два или три объекта одной - нет, нельзя, у них разные разделители (двоеточие и равно), а strsplit не принимает список разделителей.
Можно выделить каждый объект (кроме паттерна) одной командой, как Вы и делаете:
x=eval(strsplit(str,":")[1]); num=eval(strsplit(str,"=")[2]);Их конечно можно и в одну команду запихнуть, но это уже скорее извращение:
[x, num]=eval([strsplit(str,":")[1], strsplit(str,"=")[2]]);Можно описание разделения засунуть в вектор пар t[]=[[разделитель,номер],...] и обработать его одной командой
eval(apply(z->strsplit(str,z[1])[z[2],t)), но изврат ещё больший. И паттерн так не выцепишь, там нужна двойная strsplit.
Гораздо проще не париться, а решить любым образом (хоть автозаменой в редакторе, например ", num17=" на ":" и тогда можно будет выцеплять все три объекта одной
strsplit(str,":")) один раз и потом просто перекодировать файл под свои предпочтения и всё, дальше пользоваться уже только своим. Файл не настолько большой чтобы это потребовало заметного времени. Перекодировщик не выкидывать, пригодится при обновлениях файла. Например сортированный файл я получаю именно так, тремя командами на PARI:
ss=readstr("d252-num17.1e14.txt"); nn=vecsort(apply(x->eval(strsplit(x,"num17=")[2]),ss),,1); for(j=1,#nn, print(ss[nn[j]]); );. Заметьте, выцеплять все объекты мне не понадобилось, только третий, остальные использую в составе исходной строки.
Вообще это хороший пример необходимости внимательного продумывания форматов данных
перед запуском долгих вычислений. Я продумал недостаточно, двоеточие было бы удобнее. Ну да мне и перекодировать не влом, это не гигабайты.
-- 15.02.2024, 13:00 --А с другой стороны одинаковый разделитель всех полей неудобен когда в каждом поле могут встретиться одинаковые величины. Например перечислить len и valids можно и через ":", но тогда как по ним фильтровать (без PARI)? А когда все поля имеют имена - очень просто, командой dos findstr по строке "len=??" или "valids=??" и никакой путаницы между ними. Потому я обычно предпочитаю разные разделители и именованные переменные.