如何在布尔值列表中搜索第一个 true?
How do I search a list of booleans for the first true?
我正在尝试查找第一个真值的索引:
1b?001b
Expected result: 2
Actual result: ,0b
两个问题:
- 如何解决这个问题?
- 我的代码实际上在做什么?
对于你的第一个问题,你想使用 where
关键字,当传递一个布尔列表时,它将 return 真实值的索引:
q)where 00101b
2 4
用上面的前面的first
就可以得到你想要的
对于你的第二个问题,我认为 q 将左参数转换为 int/long,然后在右参数列表中转换为 'rolling'(参见 https://code.kx.com/q/ref/deal/)。
示例:
q)0b?111b
`boolean$() //return 0 random elements from 111b
q)1b?111b
,1b //return 1 random element from 111b
除了@Kylebonnes 的回答,如果您还想使用“?”查找运算符,可以这样做:
q)001b?1b
2
使用 Find,就像@xxPJFxx 所做的那样,意味着搜索在第一次命中时停止,其中 where
找到所有命中:
q)show L:1000000?0b
101001111111001110100001110101011011010000101001010110010110111010000010000100000000100..
q)\ts:1000 first where L
396 4194512
q)\ts:1000 L?1b
0 704
你的第二个问题的早期答案是正确的:你发现了 Roll 运算符的一个未记录的边缘情况,它接受一个整数左参数。如果还支持布尔左参数,我将与实现者核实并更新文档。
Overloaded glyphs 页面可以帮助您识别字形表示哪个运算符。
我正在尝试查找第一个真值的索引:
1b?001b
Expected result: 2
Actual result: ,0b
两个问题:
- 如何解决这个问题?
- 我的代码实际上在做什么?
对于你的第一个问题,你想使用 where
关键字,当传递一个布尔列表时,它将 return 真实值的索引:
q)where 00101b
2 4
用上面的前面的first
就可以得到你想要的
对于你的第二个问题,我认为 q 将左参数转换为 int/long,然后在右参数列表中转换为 'rolling'(参见 https://code.kx.com/q/ref/deal/)。
示例:
q)0b?111b
`boolean$() //return 0 random elements from 111b
q)1b?111b
,1b //return 1 random element from 111b
除了@Kylebonnes 的回答,如果您还想使用“?”查找运算符,可以这样做:
q)001b?1b
2
使用 Find,就像@xxPJFxx 所做的那样,意味着搜索在第一次命中时停止,其中 where
找到所有命中:
q)show L:1000000?0b
101001111111001110100001110101011011010000101001010110010110111010000010000100000000100..
q)\ts:1000 first where L
396 4194512
q)\ts:1000 L?1b
0 704
你的第二个问题的早期答案是正确的:你发现了 Roll 运算符的一个未记录的边缘情况,它接受一个整数左参数。如果还支持布尔左参数,我将与实现者核实并更新文档。
Overloaded glyphs 页面可以帮助您识别字形表示哪个运算符。