我怎样才能中断a';循环';在kdb?

我怎样才能中断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

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 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。在实际情况中,我有另一个列表,我使用和每个权利来检查一些条件。我的问题是,我是否可以打破循环,或者至少在满足条件后如何忽略其余的数字。