如何删除包含一个元素的所有框?例如。我想转此:
┌─────┬───┬─┬─────┐
│1 1 1│2 2│3│2 2 2│
└─────┴───┴─┴─────┘
进入这个:
┌─────┬───┬─────┐
│1 1 1│2 2│2 2 2│
└─────┴───┴─────┘
答案 0 :(得分:4)
假设您的值在a
:
]a =. 1 1 1; 2 2; 3; 2 2 2
┌─────┬───┬─┬─────┐
│1 1 1│2 2│3│2 2 2│
└─────┴───┴─┴─────┘
这里的技巧是获得每个盒子的长度:
#@> a
3 2 1 3
如果长度> 1,你得到一个“面具”,你可以传递给copy。
1 < #@> a
1 1 0 1
a #~ 1 < #@> a
┌─────┬───┬─────┐
│1 1 1│2 2│2 2 2│
└─────┴───┴─────┘
13:
会告诉我们如何做出这种默契:
13 : 'y #~ 1<#@>y'
] #~ 1 < #@>
碰巧,需要将id
放在fork的最后位置正是钩子的作用,所以我们甚至可以再简化一步:
remsingles =. #~ 1 < #@>
remsingles a
┌─────┬───┬─────┐
│1 1 1│2 2│2 2 2│
└─────┴───┴─────┘
答案 1 :(得分:4)
@ Daniel的回答另一种观点。
过滤列表非常常见,通常的习惯用语是:
(#~ filter)
其中filter
是一个动词,为要保留的元素返回1
,为要丢弃的元素返回0
。在这种情况下,您的过滤器是
(1 < size) for_each_element
将size
翻译为#
,将for_each_element
翻译为动词"every"
(&>
),过滤器为
(1 < #) &>
所以,
remsingles =: #~ (1 < #) &>
remsingles a
┌─────┬───┬─────┐
│1 1 1│2 2│2 2 2│
└─────┴───┴─────┘