Elixir 列表折纸~从两个列表生成新列表
我目前正在学习长生不老药,我仍在努力让我的头脑围绕清单理解。我有两个列表,内容和一个素数的一次性列表。我使用两个列表理解,然后使用一个Elixir 列表折纸~从两个列表生成新列表,elixir,Elixir,我目前正在学习长生不老药,我仍在努力让我的头脑围绕清单理解。我有两个列表,内容和一个素数的一次性列表。我使用两个列表理解,然后使用一个if来确定它是否是素数,将其丢弃并从列表中删除 iex(25)> content = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] iex(26)> for c <- content do ...(26)> fo
if
来确定它是否是素数,将其丢弃并从列表中删除
iex(25)> content = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
iex(26)> for c <- content do
...(26)> for s <- [1, 3, 5, 7] do
...(26)>
...(26)> if s == c do
...(26)> List.delete(content, s)
...(26)> end
...(26)>
...(26)> end
...(26)> end
[[[2, 3, 4, 5, 6, 7, 8, 9, 10], nil, nil, nil], [nil, nil, nil, nil],
[nil, [1, 2, 4, 5, 6, 7, 8, 9, 10], nil, nil], [nil, nil, nil, nil],
[nil, nil, [1, 2, 3, 4, 6, 7, 8, 9, 10], nil], [nil, nil, nil, nil],
[nil, nil, nil, [1, 2, 3, 4, 5, 6, 8, 9, 10]], [nil, nil, nil, nil],
[nil, nil, nil, nil], [nil, nil, nil, nil]]
此外,我还尝试将其与
Enum.map
一起使用,但造成了更大的混乱。有人能告诉我如何获得我想要的1xN列表吗?有一个简单的方法:
l = [1,2,3,4,5,6,7,8,9,10]
o = [1,3,5,7,9]
d = l -- o
我不确定是否可以使用列表理解来实现你想要实现的目标
编辑:我应该把问题看得更仔细一点。我认为提问者只是想通过列表理解来寻求一种方法。重读这个问题,我发现我只是看错了。我已经编辑了我的答案 有一个简单的方法可以做到这一点:
l = [1,2,3,4,5,6,7,8,9,10]
o = [1,3,5,7,9]
d = l -- o
我不确定是否可以使用列表理解来实现你想要实现的目标
编辑:我应该把问题看得更仔细一点。我认为提问者只是想通过列表理解来寻求一种方法。重读这个问题,我发现我只是看错了。我已经编辑了我的答案 带有
for
的列表理解始终返回一个列表。因此,如果将一个for
嵌套在另一个for
中,则内部的for
将返回一个列表,因此外部for的每个元素都将是一个列表,因此是一个列表列表。这里没什么奇怪的事
另一件正在发生的事情,您可能没有预料到的是结果中的nil
s的数量:内部for
的最后一个表达式是if
,没有else
分支。这意味着,如果条件为true,则返回if
的主体,如果条件为false,则返回nil
Onorio的回答(使用-/2
)在我看来很好。您可以做的另一件事(不需要列表理解)是使用Enum.reject/2
过滤掉非素数:
Enum.reject(content, fn n -> n in [1, 3, 5, 7] end)
如果您确实想使用进行
,您可以使用防护:
for n in contents, not n in [1, 3, 5, 7], do: n
为了完整起见,最后一件事是:当您执行
List.delete(contents,…)
时,您并不是在修改原始的内容列表。使用for
的列表理解始终返回一个列表。因此,如果将一个for
嵌套在另一个for
中,则内部的for
将返回一个列表,因此外部for的每个元素都将是一个列表,因此是一个列表列表。这里没什么奇怪的事
另一件正在发生的事情,您可能没有预料到的是结果中的nil
s的数量:内部for
的最后一个表达式是if
,没有else
分支。这意味着,如果条件为true,则返回if
的主体,如果条件为false,则返回nil
Onorio的回答(使用-/2
)在我看来很好。您可以做的另一件事(不需要列表理解)是使用Enum.reject/2
过滤掉非素数:
Enum.reject(content, fn n -> n in [1, 3, 5, 7] end)
如果您确实想使用进行
,您可以使用防护:
for n in contents, not n in [1, 3, 5, 7], do: n
为了完整起见,最后一件事是:当您执行List.delete(contents,…)
时,您并不是在修改原始的contents
列表。感谢您解释@plotplot为什么会得到这样一个奇怪的列表。我对此也有点困惑。谢谢你解释为什么@plotplot会得到这样一个奇怪的列表。我也有点困惑,这太完美了。谢谢你的洞察力!也要感谢@whatyouhideThis,这是完美的。谢谢你的洞察力!同样感谢@whatyouhideBTW,它没有更好的效果,但是你可以将你的两个列表理解合并成一个结构:顺便说一句,对于c,它没有更好的效果,但是你可以将你的两个列表理解合并成一个结构:对于c