使用列表推导删除对称对(使用列表推导中的notin)

时间:2016-06-08 07:59:29

标签: rascal

我有这个功能,我从列表关系中删除对称对,工作正常,但我很好奇是否可以将其重写为列表理解。

lrel[str,str] newClonePairs = [];
for (tuple[str L, str R] pair <- clonePairs) {
    if (<pair.R, pair.L> notin newClonePairs) {     
        newClonePairs += pair;
    }
}

return newClonePairs;

我到目前为止(见下面的代码),但是你如何编写notin部分呢?是否有某种关键字可用于引用当前列表?

return [pair | tuple[tuple[node,loc] L,tuple[node,loc] R] pair <- clonePairs, <pair.R, pair.L> notin thisCurrentList];

1 个答案:

答案 0 :(得分:1)

在列表理解期间无法引用您生成的列表。你可以使用减速机,但我认为它不会很快。

这个怎么样:

[ <L, R> | [*_, <L,R>, *post] := clonePairs,  <R,L> notin post ]

它将循环遍历所有<L,R>对,并仅添加在列表的其余部分中找不到的对。

它通过&#34;列表匹配&#34;起作用。列表模式可以包含前面带有*的变量,它将匹配任何长度的子列表(包括空列表)。这样的匹配通常不是唯一的(例如,在中间的<L,R>之上可以是列表中的任何位置,因为*_*post可以是任意长度)。如果列表模式可以通过多种方式匹配列表,那么它将成为生成器,:=将从左到右循环遍历所有匹配,类似于<-的行为。另见:http://tutor.rascal-mpl.org/Rascal/Rascal.html#/Rascal/Patterns/Abstract/List/List.html