我有兩個列表 藥劑獲取每個列表中是獨一無二的元素
現在我想有2列出了僅包含在每個表1和2 1_uniq = [%{name: "hu"}] 2_uniq = [%{name: "ha"}]
我怎麼能做到這一點?
我有兩個列表 藥劑獲取每個列表中是獨一無二的元素
現在我想有2列出了僅包含在每個表1和2 1_uniq = [%{name: "hu"}] 2_uniq = [%{name: "ha"}]
我怎麼能做到這一點?
您可以爲兩個列表創建一個列表名稱集合,將它們相交以找到常用名稱,然後過濾掉所有常見的名稱。這裏是你如何可以與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
輸出:
[%{name: "hu"}]
[%{name: "ha"}]
使用相同的思路@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)))
可以達到同樣的解決方案,而無需使用MapSet
:
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)))