kdb/q函数中if/else条件语句使用及表字段值翻转实现
在Q语言中实现翻转表中指定行的isSelected值
使用if/else分支实现
你可以通过以下函数实现需求,函数接收目标表和要翻转的行索引作为参数:
fChangeBit:{[table; rowToFlip] // 获取指定行的isSelected当前值 currentVal: table[rowToFlip; `isSelected]; // 用多分支条件判断实现翻转逻辑 $[currentVal = 0; table[rowToFlip; `isSelected]: 1; // 0转为1 currentVal = 1; table[rowToFlip; `isSelected]: 0]; // 1转为0 // 返回修改后的表 :table };
说明:
- Q语言中用
$[cond1; expr1; cond2; expr2; ...]结构实现多分支判断,对应你伪代码里的if/else if逻辑 - 直接通过
table[row; col]: newVal赋值会修改原内存表,若想保留原表并返回新表,可改用update语句(见下方)
更简洁的Q风格实现(推荐)
Q是向量化语言,无需逐行做条件判断,用算术运算就能高效完成翻转,同时返回新表不修改原表:
// 翻转指定行的isSelected值 fChangeBit:{[table; rowToFlip] update isSelected: 1 - isSelected from table where i = rowToFlip }; // 如果要翻转所有行的isSelected值,写法更简单: flipAllSelected:{[table] update isSelected: 1 - isSelected from table };
说明:
1 - isSelected通过算术运算直接翻转0和1(0→1,1→0),比条件判断更高效where i = rowToFlip指定只修改目标行,i是Q表默认的行索引列update语句会生成新表,原表不受影响,更符合函数式编程的习惯
内容的提问来源于stack exchange,提问作者mmv456
相关产品推荐
相关产品推荐

