我有两个列表:
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)
元素的顺序无关紧要,我只需要平衡它们即可。我能够以迭代的方式实现这一目标(如果认为有用,可以添加代码),但是必须有一种更优雅的方式(可能带有副词?)。
答案 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)
如果您的l2
是til 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.fc
在n
从站上分割向量参数进行多线程处理时,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