将一个列表的元素分布在另一列表的元素上

时间:2018-08-05 17:49:05

标签: kdb

我有两个列表:

l1:`a`b`c;
l2: til 20;

我正在尝试创建一个字典'd',其中包含'l1'的元素作为键,并且将'l2'的元素均匀地分布在字典上。像这样:

d:(`a`b`c)!(0j, 3j, 6j, 9j, 12j, 15j, 18j;1j, 4j, 7j, 10j, 13j, 16j, 19j;2j, 5j, 8j, 11j, 14j, 17j)

元素的顺序无关紧要,我只需要平衡它们即可。我能够以迭代的方式实现这一目标(如果认为有用,可以添加代码),但是必须有一种更优雅的方式(可能带有副词?)。

3 个答案:

答案 0 :(得分:5)

可以使用group来完成:

q)group (count[l2]#l1)
(`a`b`c)!(0j, 3j, 6j, 9j, 12j, 15j, 18j;1j, 4j, 7j, 10j, 13j, 16j, 19j;2j, 5j, 8j, 11j, 14j, 17j)

如果您的l2til 20以外的其他东西,则您必须在分组后重新查找项目:

q)l2: 20#.Q.a
q)l2
"abcdefghijklmnopqrst"
q)l2 group (count[l2]#l1)     // lookup the items back from l2 after grouping 
(`a`b`c)!("adgjmps";"behknqt";"cfilor")

答案 1 :(得分:3)

您可以使用汇整操作符#的重塑功能。它包含两个参数:至少2维的LHS和要重塑的列表。

例如(3;4)#til 12将列表0 1 ... 12整形为3 x 4矩阵

在我们的情况下,l1中元素的数量将不必精确地划分为l2中元素的数量(我们不需要矩形矩阵)。取而代之的是,我们可以提供一个空值作为第二维,这将负责分配余数。

q) l1!(count[l1];0N)#l2
a| 0 1 2 3 4 5
b| 6 7 8 9 10 11 12
c| 13 14 15 16 17 18 19

此方法在较大的输入列表中效果很好。

作为一个补充说明,当使用.Q.fcn从站上分割向量参数进行多线程处理时,kdb使用#运算符将向量整形为{{1} }向量,每个从属一个。

答案 2 :(得分:0)

q)d:`a`b`c!{a where x = (a:til 20) mod y}'[til 3;3]
q)d
a| 0 3 6 9 12 15 18
b| 1 4 7 10 13 16 19
c| 2 5 8 11 14 17