2016-06-08 66 views
1

我有這個功能,我從列表關係中刪除對稱對,工作正常,但我很好奇,是否有可能將此重寫爲列表理解。使用列表理解刪除對稱對(在列表理解中使用notin)

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

您正在生成的列表在列表理解期間無法引用。你可以用減速機,但我認爲它不會很快。

這個怎麼樣:

[ <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

+0

作品完美,謝謝!正是我在找的東西。但是,是否可以詳細闡述[* _,,* post]部分?匹配運算符適用於這三種獨立模式嗎?那究竟是什麼意思? – Nicasso

+1

編輯了答案以提供更多細節。 – jurgenv