求助: 序列 A() 语法可否支持负数
大佬们,早上好,Happy Friday😄
集算器函数中对长度为 n 的序列 A 获取值时有这样的语法:
1、A(i),此时序号或者索引号 i 的取值范围是 i ∈ [1,n]
2、A(p),此时 p 是一个数列,且 p 中的每一个元素 pi ∈ [1,n]
很明显,A()这样获取值的方式是不支持负数的。当然,如果单纯是为了按索引号获取值,spl 还提供了 A.m() 这样的写法,不仅支持负数还支持序号超界时的回转等功能。
但 A()和 A.m() 这两种写法有一个不同的地方,A()还可以用于赋值和修改。比如,A(i)=x 就可以把序列 A 中索引号为 i 处的值修改为 x,但 i 仅限于不超过序列长度的正整数,不适用于 i 等于负数的情形,比如,对一个未知长度的序列 A 想修改其倒数第一个的值,A(-1)=x 这样是不行的。如果非要用这种负数索引号的方式修改序列中的值,除了用 A.modify()之外,还可以用 A.p(-1) 获取倒数第一个的位置,写成 A(A.p(-1))=x 这样也是可以的,且 A.p@r() 还支持回转,这个也很友好。
在 Python 中,对序列取值或者赋值时是支持负数的,比如 A[-1] 取值,或者 A[-1]=x 赋值均有效。那 SPL 中用 A() 取值赋值是不是也可以支持一下负数,使得以下写法有效:
A(-1)=x
A([1,-2])=[x,y]
恳请大佬们得闲时指导解惑,谢谢🙏 🙏
因为 A(i) 中的 i 有可能是通过计算算出来的,有越界抛出异常的需求,所以设计了 A.m(i)、A.p(i) 函数来实现越界返回 null 和从后取的功能。
SPL 提供了专门的修改函数来维护序列的成员,比如:A.insert、A.modify、A.delete,这些函数支持负数表示从后数。
我又想多了,哈哈…虽然…不纠结了😂
谢谢大佬指点解惑,周末愉快哈🙏 🙏
大佬们,方便的时候,帮忙看一下,下图中 A12 代码格中用 iterate 之后最终的结果是一个两个元素的序列 [x,y],要取出第一个值 x,正常来说用(1) 可以获取,但此处不行,只能用.m(1)获取。
图中需求是,统计每个人的达标次数,0 表示未达标,1 表示达标,需连续 3 次为 1 计达标 1 次,splx 文件一并附上:
SPLiteratesplxzip
http://d.raqsoft.com.cn:6999/esproc/func/groups.html
groups 里的聚合表达式仅支持文档中列的这些,要取出 iterate 的第一个值应该放到 groups 外面来做。
大佬,groups 里不是已经支持复杂聚合表达式了吗?
那图中…groups(xx;iterate(xx).m(1)) 中 ".m(1)" 这部分用法是对的还是错的?
抱歉,对复杂聚合表达式的识别之前不是我做的所以印象不深忘记了。。。
刚看了一下代码,对取成员运算的识别做的不对,刚做了修改已经上传到 github 了。
A.groups(xx;iterat(x)(1):s)实际上是变成 A.groups(xx;iterat(x):s).new(xx,s(1):s)来计算的,groups 本质上还是只认识文档里列的那些聚合函数,碰到不认识的则会转成 A.groups(…).new(…) 来计算
不抱歉,大佬言重了🙏
复杂聚合表达式的原理懂了,感谢大佬指导解惑,给你添麻烦了🙏
😄 反正已经添麻烦了,哈哈,
可不可以再麻烦你一下,像这种连续 3 次计数 1 次,你会怎么做?
此例已经简化了,一般还会有一个日期列,也就是多一个连续日期的条件。
方便时,可否赐予高招🙏 🙏
可以用两次分组来计算,大概如下:
=A.groups@o(姓名, 达标;sum( 达标):count).groups( 姓名;sum(count\3):count)
count\3 是整除运算
👍 👍 你这个好一些…
我之前用了合并文本后再以 0 为分隔符 split,又是合又是拆,如果文本很长估计不理想: