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