我怎样才能中断a';循环';在kdb?
numb是一个数字列表:我怎样才能中断a';循环';在kdb?,kdb,Kdb,numb是一个数字列表: q))input 42 58 74 51 63 23 41 40 43 16 64 29 35 37 30 3 34 33 25 14 4 39 66 49 69 13.. 31 41 39 27 9 21 7 25 34 52 60 13 43 71 10 42 19 30 46 50 17 33 44 28 3 62.. 15 57 4 55 3 28 14 21 35 29 52 1 50 10 39 70 43 53 46 68 40 27
q))input
42 58 74 51 63 23 41 40 43 16 64 29 35 37 30 3 34 33 25 14 4 39 66 49 69 13..
31 41 39 27 9 21 7 25 34 52 60 13 43 71 10 42 19 30 46 50 17 33 44 28 3 62..
15 57 4 55 3 28 14 21 35 29 52 1 50 10 39 70 43 53 46 68 40 27 13 69 20 49..
3 34 11 53 6 5 48 51 39 75 44 32 43 23 30 15 19 62 64 69 38 29 22 70 28 40..
18 30 60 56 12 3 47 46 63 19 59 34 69 65 26 61 50 67 8 71 70 44 39 16 29 45..
我想迭代每一行,然后计算前2个数的和,然后是3个数,然后是4个数,等等。如果这个和大于1000,我想停止那一行的迭代,跳到下一行,做同样的事情。这是我的代码:
{[input]
tot::tot+{[x;y]
if[1000<sum x;:count x;x,y]
}/[input;input]
}each numb
蟒蛇
for i in range(100):
if i == 50:
print(i);
break;
R
我想这就是你想要实现的
sum {(x & sums y) ? x}[1000] each input
它获取每行的累积和,并在该和和与输入限制之间获取元素最小值,从而将输出限制在如下限制:
q)(100 & sums 40 43 16 64 29)
40 83 99 100 100
然后它会使用?运算符以查找该限制的第一次出现(即此限制等于或通过的元素),并在索引为0时添加一个。在本例中,前100个出现在3个元素之后。您可能希望添加一个,以在计数中包含限制之后的第一个元素
q)40 83 99 100 100 ? 100
3
然后它对所有输入行的计数求和。我认为这就是您试图实现的目标
sum {(x & sums y) ? x}[1000] each input
它获取每行的累积和,并在该和和与输入限制之间获取元素最小值,从而将输出限制在如下限制:
q)(100 & sums 40 43 16 64 29)
40 83 99 100 100
然后它会使用?运算符以查找该限制的第一次出现(即此限制等于或通过的元素),并在索引为0时添加一个。在本例中,前100个出现在3个元素之后。您可能希望添加一个,以在计数中包含限制之后的第一个元素
q)40 83 99 100 100 ? 100
3
然后它对所有输入行的计数求和。在这种情况下,当您无法满足某个条件时,您可以使用覆盖率退出 第一个参数是一个函数,它根据当前值x进行检查,x将是在主函数中传递的下一个值 例如,我使用主输入行进行了一个投影,然后每次增加我求和的索引:
q)numb
98 11 42 97 89 80 73 35 4 30
86 33 38 86 26 15 83 71 21 22
23 43 41 80 56 11 22 28 47 57
q){[input] {x+1}/[{100>sum (y+1)#x}[input;];0] }each numb
1 1 2
这将返回运行总和超过100的每个索引的第一个索引
然而,这并不是KDB的理想用例
可以用类似的方法来代替
(sums@/:numb) binr\: 100
也许您的真实示例更有意义在这种情况下,您可以在无法满足条件时使用覆盖率退出 第一个参数是一个函数,它根据当前值x进行检查,x将是在主函数中传递的下一个值 例如,我使用主输入行进行了一个投影,然后每次增加我求和的索引:
q)numb
98 11 42 97 89 80 73 35 4 30
86 33 38 86 26 15 83 71 21 22
23 43 41 80 56 11 22 28 47 57
q){[input] {x+1}/[{100>sum (y+1)#x}[input;];0] }each numb
1 1 2
这将返回运行总和超过100的每个索引的第一个索引
然而,这并不是KDB的理想用例
可以用类似的方法来代替
(sums@/:numb) binr\: 100
也许您的真实示例更有意义Kdb确实有一个“停止循环”机制,但仅限于具有单个种子值的一元函数的情况
/keep squaring until number is no longer less than 1000, starting at 2
q){x*x}/[{x<1000};2]
65536
/keep dealing random numbers under 20 until you get an 18 (seed value 0 is irrelevant)
q){first 1?20}\[18<>;0]
0 19 17 12 15 10 18
/保持平方,直到数字不再小于1000,从2开始
q) {x*x}/[{xKdb确实有一个“停止循环”机制,但仅在具有单种子值的一元函数的情况下
/keep squaring until number is no longer less than 1000, starting at 2
q){x*x}/[{x<1000};2]
65536
/keep dealing random numbers under 20 until you get an 18 (seed value 0 is irrelevant)
q){first 1?20}\[18<>;0]
0 19 17 12 15 10 18
/保持平方,直到数字不再小于1000,从2开始
q) {x*x}/[{x您可以在KDB中使用while循环,尽管所有KDB开发人员通常都非常害怕被公开嘲笑和嘲笑
q){i:0;while[i<>50;i+:1];:"loop exited at ",string i}`
"loop exited at 50"
q){i:0;while[i50;i+:1];:“循环在退出”,字符串i}`
“循环在50时退出”
您可以在KDB中使用while循环,尽管所有KDB开发人员通常都非常害怕被公开嘲笑和嘲笑
q){i:0;while[i<>50;i+:1];:"loop exited at ",string i}`
"loop exited at 50"
q){i:0;while[i50;i+:1];:“循环在退出”,字符串i}`
“循环在50时退出”
我认为您描述的是binr而不是find(?)。如果没有得到精确匹配的q)40 83 99 101 102 binr 100
hi mark,将返回最大索引+1。这是我需要实现的一个简化示例。我的聚合函数不是一个真正的求和函数。我更感兴趣的是,当条件为m时,如何停止迭代以继续使用同一行并跳到下一行我认为你在描述binr而不是find(?)。如果没有得到精确匹配的q)40 83 99 101 102 binr 100
hi mark,将返回最大索引+1。这是我需要实现的一个简化示例。我的聚合函数不是一个真正的求和函数。我更感兴趣的是,当条件为m时,如何停止迭代以继续使用同一行并跳到下一行“您错过了结尾”]“if语句的括号。不确定over在这里做什么,因为它将把输入连接到自身,但不返回它。我们的想法是取每一行,然后逐个遍历数字1。例如,在第一步中,列表将是,42
,然后我们求和,看看这是否大于1000。然后,我们添加下一个元素,然后we有42 58
,我们求和并比较,看看它是否大于1000。在实际情况中,我有另一个列表,我使用和每个权利来检查一些条件。我的问题是,我是否可以打破循环,或者至少在满足条件后如何忽略其余的数字。你错过了结尾“]”if语句的括号。不确定over在这里做什么,因为它将把输入连接到自身,但不返回它。我们的想法是取每一行,然后逐个遍历数字1。例如,在第一步中,列表将是,42
,然后我们求和,看看这是否大于1000。然后,我们添加下一个元素,然后we有42 58
,我们求和并比较,看看它是否大于1000。在实际情况中,我有另一个列表,我使用和每个权利来检查一些条件。我的问题是,我是否可以打破循环,或者至少在满足条件后如何忽略其余的数字。