簡體   English   中英

將列表元素與所有其他元素進行比較

[英]Compare an element of a list against all other elements

說我有一個Scala列表,

val list : List[Set[Int]] = List(set1, set2, set3, set4)

我列表中的每個元素都是一組整數。

我在尋找一種優雅的方式來創建在我的列表中的每個元素對所有其他人相比的列表。 例如,我可能想要生成一個列表,其中每個元素(集合)僅包含未包含在列表的任何其他元素中的元素。

例如,我有一些功能:

def f(element : Set[Int], rest_of_list : List[Set[Int]]) : Set[Int]

我想做類似於list.map(f(_, rest_of_list))事情list.map(f(_, rest_of_list))而不必為每個元素構造rest_of_list 我現在能想到的唯一方法是使用slice ,這使得它非常丑陋和低效,imo。

您可以使用diff而不是slice

 list.map(set => set diff (list diff List(set)).flatten.toSet)
 //Alternative with filterNot
 list.map(set => set.filterNot((list diff List(set)).flatten.contains))  

diff在這里工作,因為它只刪除元素的一個實例,而Set[Int]有一個很好的equals方法:

List(Set(1), Set(1, 2)) diff List(Set(1)) //List(Set(1, 2))
List(Set(1), Set(1)) diff List(Set(1)) //List(Set(1))

因此,為此,將一個集映射到列表中所有其他集的列表:

val setWithOthers = list.map(set => set -> (list diff List(set)))
val setWithOthers = (list, list.map(list diff List(_))).zipped.toList //equivalent, less efficient

因此,如果您想要在list元素之間映射函數f ,您可以:

setsWithOthers.map { case(set, others) => f(set, others) }
setsWithOthers.map(kvp => f(kvp._1, kvp._2))
setsWithOthers.map((f _).tupled)

您還可以創建完整的多重集,跟蹤每個元素出現的次數。 然后,在循環的每次迭代中,您可以從完整的multiset“減去”一個集合:

val multiset = list.flatten.groupBy(identity).mapValues(_.length)

我不知道它是否像你想要的那樣優雅,但更通用的方式是你可以用任何東西替換'f':

val list = List(Set(1,2,3,4),Set(1,2),Set(1,3))

list.map(e => f(e,list.filterNot(_==e)))
//res0: List[Set[Int]] = List(Set(4), Set(), Set())

def f(element : Set[Int], rest_of_list : List[Set[Int]]) : Set[Int] = {
  (element.toList diff rest_of_list.flatten.toList).toSet
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM