Elixir获取每个列表中唯一的元素

Elixir获取每个列表中唯一的元素,elixir,Elixir,我有两张单子 1=[%{name:“hi”},%{name:“hu”}] 2=[%{name:“hi”},%{name:“ha”}] 现在我想有两个列表,其中只包含列表1和列表2中唯一的元素 1_uniq=[%{name:“hu”}] 2_uniq=[%{name:“ha”}] 如何实现这一点?您可以为两个列表创建一组名称列表,将它们相交以查找通用名称,然后过滤掉所有通用名称。以下是如何使用Elixir中的MapSet模块执行此操作: l1 = [%{name: "hi"}, %{nam

我有两张单子

1=[%{name:“hi”},%{name:“hu”}]
2=[%{name:“hi”},%{name:“ha”}]

现在我想有两个列表,其中只包含列表1和列表2中唯一的元素

1_uniq=[%{name:“hu”}]
2_uniq=[%{name:“ha”}]


如何实现这一点?

您可以为两个列表创建一组名称列表,将它们相交以查找通用名称,然后过滤掉所有通用名称。以下是如何使用Elixir中的
MapSet
模块执行此操作:

l1 = [%{name: "hi"}, %{name: "hu"}]
l2 = [%{name: "hi"}, %{name: "ha"}]

# set of names
s1 = for x <- l1, into: MapSet.new, do: x.name
s2 = for x <- l2, into: MapSet.new, do: x.name

# set of common names
common = MapSet.intersection(s1, s2)

# filter out any name that's in `common`
l1_unique = for x <- l1, !MapSet.member?(common, x.name), do: x
l2_unique = for x <- l2, !MapSet.member?(common, x.name), do: x

IO.inspect l1_unique
IO.inspect l2_unique

您可以为这两个列表创建一组名称,将它们相交以查找通用名称,然后过滤掉所有通用名称。以下是如何使用Elixir中的
MapSet
模块执行此操作:

l1 = [%{name: "hi"}, %{name: "hu"}]
l2 = [%{name: "hi"}, %{name: "ha"}]

# set of names
s1 = for x <- l1, into: MapSet.new, do: x.name
s2 = for x <- l2, into: MapSet.new, do: x.name

# set of common names
common = MapSet.intersection(s1, s2)

# filter out any name that's in `common`
l1_unique = for x <- l1, !MapSet.member?(common, x.name), do: x
l2_unique = for x <- l2, !MapSet.member?(common, x.name), do: x

IO.inspect l1_unique
IO.inspect l2_unique

使用与@Dogbert相同的想法,我更喜欢下面的代码片段,因为您的迭代次数更少

l1 = [%{name: "hi"}, %{name: "hu"}]
l2 = [%{name: "hi"}, %{name: "ha"}]

set = MapSet.new(l1 ++ l2)

l1_uniq = Enum.reject(set, &(Enum.member?(l2, &1)))
l2_uniq = Enum.reject(set, &(Enum.member?(l1, &1)))
无需使用
地图集
,即可实现相同的解决方案:

l1 = [%{name: "hi"}, %{name: "hu"}]
l2 = [%{name: "hi"}, %{name: "ha"}]

set = Enum.uniq(l1 ++ l2)

l1_uniq = Enum.reject(set, &(Enum.member?(l2, &1)))
l2_uniq = Enum.reject(set, &(Enum.member?(l1, &1)))

使用与@Dogbert相同的想法,我更喜欢下面的代码片段,因为您的迭代次数更少

l1 = [%{name: "hi"}, %{name: "hu"}]
l2 = [%{name: "hi"}, %{name: "ha"}]

set = MapSet.new(l1 ++ l2)

l1_uniq = Enum.reject(set, &(Enum.member?(l2, &1)))
l2_uniq = Enum.reject(set, &(Enum.member?(l1, &1)))
无需使用
地图集
,即可实现相同的解决方案:

l1 = [%{name: "hi"}, %{name: "hu"}]
l2 = [%{name: "hi"}, %{name: "ha"}]

set = Enum.uniq(l1 ++ l2)

l1_uniq = Enum.reject(set, &(Enum.member?(l2, &1)))
l2_uniq = Enum.reject(set, &(Enum.member?(l1, &1)))