List erlang列表筛选器问题

List erlang列表筛选器问题,list,filter,erlang,List,Filter,Erlang,我有一份清单——9月1日: [ .... ["Message-ID", "AAAAAAAAAAAAAAAAAAA"], ["To", "BBBBBBBBBBBBBBBBB"] ... ] 我尝试获取元素,其中第一项=Message\u ID,例如: lists:filter(fun(Y) -> (lists:nth(1,lists:nth(1,Y)) =:= "Message-ID") end, Sep1). 但我得到了一个错误: exception erro

我有一份清单——9月1日:

[
   ....
   ["Message-ID", "AAAAAAAAAAAAAAAAAAA"],
   ["To", "BBBBBBBBBBBBBBBBB"]
   ...
]
我尝试获取元素,其中第一项=Message\u ID,例如:

lists:filter(fun(Y) -> (lists:nth(1,lists:nth(1,Y)) =:= "Message-ID") end, Sep1).
但我得到了一个错误:

 exception error: no function clause matching lists:nth(1,[])

 in function  utils:'-parse_to/1-fun-1-'/1

 in call from lists:'-filter/2-lc$^0/1-0-'/2
但如果我:

io:format(lists:nth(1,lists:nth(1,Sep1))).
> Message-ID
怎么了


谢谢。

假设您的列表只包含元素,每个元素有2个元素,您可以使用列表执行以下操作:

1> L = [["Message-ID","AAAAAAAA"],["To","BBBBBBBBBBB"]].
[["Message-ID","AAAAAAAA"],["To","BBBBBBBBBBB"]]
2> [[A,B]||[A,B] <- L, A =:= "Message-ID"].
[["Message-ID","AAAAAAAA"]]
1>L=[[“消息ID”,“AAAAAAAA”],[“To”,“bbbbbbbbb”]]。
[[“邮件ID”,“aaaaaa”],[“收件人”,“BBBBBBBBBBB”]]

2> [[A,B]|[A,B]假设您的列表只包含元素,每个元素有2个元素,您可以使用列表执行以下操作:

1> L = [["Message-ID","AAAAAAAA"],["To","BBBBBBBBBBB"]].
[["Message-ID","AAAAAAAA"],["To","BBBBBBBBBBB"]]
2> [[A,B]||[A,B] <- L, A =:= "Message-ID"].
[["Message-ID","AAAAAAAA"]]
1>L=[[“消息ID”,“AAAAAAAA”],[“To”,“bbbbbbbbb”]]。
[[“邮件ID”,“aaaaaa”],[“收件人”,“BBBBBBBBBBB”]]

2> [[A,B]|[A,B]最好将表示形式更改为
[{Key,Value},…]
,这样您就可以使用函数、模块或将其转换为

但如果仍要使用,可以按第一个元素筛选列表列表,如下所示:

lists:filter(fun ([K | _]) -> K =:= "Message-ID" end, ListOfLists).
如果您想提取列表的尾部,您可以使用以下方法提取第一个元素与“消息ID”匹配的列表:


[Tail | |[“Message ID”| Tail]最好将表示形式更改为
[{Key,Value},…]
,以便使用函数、模块或将其转换为

但如果仍要使用,可以按第一个元素筛选列表列表,如下所示:

lists:filter(fun ([K | _]) -> K =:= "Message-ID" end, ListOfLists).
如果您想提取列表的尾部,您可以使用以下方法提取第一个元素与“消息ID”匹配的列表:


[Tail | |[“Message ID”| Tail]为什么要使用两个嵌套的
列表:n次
调用

lists:filter(fun(Y)->lists:nth(1,Y)=:=“Message ID”end,Sep1)
适用于我并返回包含所需元素的列表(第一个元素为
“Message ID”
)的列表。只需在该列表上进行模式匹配即可获得所需元素,例如,如果您只需要一个这样的元素,则可以执行以下操作:

case lists:filter(fun(Y) -> lists:nth(1, Y) =:= "Message-ID" end, Sep1) of
  [Result] -> % do something with it;
  [] -> % no such element found
end

为什么要使用两个嵌套的
列表:第n个
调用

lists:filter(fun(Y)->lists:nth(1,Y)=:=“Message ID”end,Sep1)
适用于我并返回包含所需元素的列表(第一个元素为
“Message ID”
)的列表。只需在该列表上进行模式匹配即可获得所需元素,例如,如果您只需要一个这样的元素,则可以执行以下操作:

case lists:filter(fun(Y) -> lists:nth(1, Y) =:= "Message-ID" end, Sep1) of
  [Result] -> % do something with it;
  [] -> % no such element found
end

您可能想要的是:

[B || [A,B|_] <- L, A =:= "Message-ID"].

[B | |[A,B | |]您可能想要的是:

[B || [A,B|_] <- L, A =:= "Message-ID"].

[B | |[A,B | |]您可以创建自己的过滤器(它不关心元素的数量):


您可以创建自己的过滤器(它不关心元素的数量):



lists:filter
为列表中的每个元素调用乐趣。下面的代码只是将整个列表传递到
lists:nth
。我如何按列表中的每个元素的第一个元素筛选列表?我怀疑您在某个地方还有其他问题。当我将您的
Sep1
和您的
lists:filter
调用复制到我的Erlang shell中时,我得到
[]
-答案当然不正确,但与您遇到的错误不同。您确定粘贴的
Sep1
正确吗?
list:filter
为列表中的每个元素调用乐趣。下面的代码只是将整个列表传递到
list:nth
。我如何按每个元素筛选列表st?我怀疑你在什么地方遇到了另一个问题。当我将你的
Sep1
和你的
列表:filter
调用复制到我的Erlang shell中时,我得到了
[]
-答案当然不正确,但与您得到的错误不同。您确定粘贴的
Sep1
正确吗?不,列表中没有2个元素。他的代码只假设内幕列表有2个元素-1:这假设内部列表包含两个元素,在这种情况下,没有理由首先使用列表。请在比较中使用
=:=
,无正当理由使用
=
是一个坏例子。感谢您提到这一点。我错过了这一点,因为我通常使用“=:=”,并且完全同意使用“=”在erlang中,这是一种不好的做法。不,列表中没有2个元素。他的代码只假设内部列表有2个元素-1:这假设内部列表包含两个元素,在这种情况下,首先没有理由使用列表。在比较中,请使用
=:=
,在没有充分理由的情况下使用
=
糟糕的例子。谢谢你提到这一点。我错过了这一点,因为我通常使用“=:=”,并且完全同意在erlang中使用“==”是一种糟糕的做法。如果初始列表中的一个元素是空列表,这将失败。列表:键*函数和列表:过滤器示例与预期一样,使用3个元素元组和相应的3个元素列表<代码>有趣([K | |]->K=:=ExpectedValue;(|)->FalseEnd
可以处理任何类型的元素。但是您不应该先检查输入数据吗?另外,您可以直接进行模式匹配,即
乐趣([“Message ID”| |]->true;(|)->FalseEnd
。如果使用了第二个子句(如上面的注释中所示),则是的但它不适用于原始示例。事实上,我不喜欢注释中的示例,因为任何内容都可以匹配,但您必须知道您的数据。如果初始列表中的一个元素是空列表,则此操作将失败。列表:key*函数和列表:过滤器示例与预期一样,使用3个元素元组和3个元素列表
fun([K | |])->K=:=ExpectedValue;(|)->FalseEnd
可以处理任何类型的元素。但是您不应该先检查输入数据吗?另外,您可以直接进行模式匹配,即
fun([Message ID”| |])->true;(|)->FalseEnd