首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用列表理解删除对称对(在列表理解中使用notin )

使用列表理解删除对称对(在列表理解中使用notin )
EN

Stack Overflow用户
提问于 2016-06-08 07:59:28
回答 1查看 95关注 0票数 1

我有一个函数,在这个函数中,我从列表关系中删除了符号对,工作得很好,但我很好奇是否有可能将它重写为列表理解。

代码语言:javascript
复制
lrel[str,str] newClonePairs = [];
for (tuple[str L, str R] pair <- clonePairs) {
    if (<pair.R, pair.L> notin newClonePairs) {     
        newClonePairs += pair;
    }
}

return newClonePairs;

我已经完成了这一步(请参阅下面的代码),但是接下来如何编写notin部分呢?是否有某种关键字可用于引用当前列表?

代码语言:javascript
复制
return [pair | tuple[tuple[node,loc] L,tuple[node,loc] R] pair <- clonePairs, <pair.R, pair.L> notin thisCurrentList];
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-08 08:19:50

您正在生成的列表不能在列表理解过程中引用。你可以用减速机,但我不认为它会很快。

这个怎么样?

代码语言:javascript
复制
[ <L, R> | [*_, <L,R>, *post] := clonePairs,  <R,L> notin post ]

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37696563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档