使用列表理解删除对称对(在列表理解中使用 notin)
Removing symmetric pairs using a list comprehension (using notin in a list comprehension)
我有这个函数,可以从列表关系中删除对称对,工作正常,但我很好奇是否可以将其重写为列表理解。
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];
在列表理解过程中无法引用您正在生成的列表。使用减速器你可以,但我认为它不会很快。
这个怎么样:
[ <L, R> | [*_, <L,R>, *post] := clonePairs, <R,L> notin post ]
它将遍历所有 <L,R>
对,并仅添加列表其余部分中未找到的对。
它通过 "list matching" 工作。列表模式可以包含前面带有 *
的变量,它将匹配任意长度的子列表(包括空列表)。这样的匹配通常不是唯一的(例如上面中间的 <L,R>
可以是列表中的任何位置,因为 *_
和 *post
可以是任意长度)。如果一个列表模式可以通过多种方式匹配一个列表,那么它就变成了一个生成器,:=
会从左到右循环所有的匹配项,类似于 <-
的行为。另见:http://tutor.rascal-mpl.org/Rascal/Rascal.html#/Rascal/Patterns/Abstract/List/List.html
我有这个函数,可以从列表关系中删除对称对,工作正常,但我很好奇是否可以将其重写为列表理解。
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];
在列表理解过程中无法引用您正在生成的列表。使用减速器你可以,但我认为它不会很快。
这个怎么样:
[ <L, R> | [*_, <L,R>, *post] := clonePairs, <R,L> notin post ]
它将遍历所有 <L,R>
对,并仅添加列表其余部分中未找到的对。
它通过 "list matching" 工作。列表模式可以包含前面带有 *
的变量,它将匹配任意长度的子列表(包括空列表)。这样的匹配通常不是唯一的(例如上面中间的 <L,R>
可以是列表中的任何位置,因为 *_
和 *post
可以是任意长度)。如果一个列表模式可以通过多种方式匹配一个列表,那么它就变成了一个生成器,:=
会从左到右循环所有的匹配项,类似于 <-
的行为。另见:http://tutor.rascal-mpl.org/Rascal/Rascal.html#/Rascal/Patterns/Abstract/List/List.html