【问题标题】:How to check if an item exists in an Elixir list or tuple?如何检查 Elixir 列表或元组中是否存在项目?
【发布时间】:2016-07-25 15:53:13
【问题描述】:

这看起来很简单,但我似乎无法在文档中找到它。如果列表或元组中存在项目,我需要简单地返回 truefalseEnum.find/3 真的是最好的方法吗?

Enum.find(["foo", "bar"], &(&1 == "foo")) != nil

【问题讨论】:

  • 对于一个列表,我可以看到您想在哪里查看该项目是否存在其中 Enum.member?/2 会很好。但是对于一个元组,你通常关心值的位置,这是元组的优点之一......如果你不关心位置,可能需要考虑使用元组
  • 如果正确,您可能希望将@Gazler 的答案标记为已接受的答案。
  • 关于性能的快速说明。 x in y 守卫非常高效,因为它在编译时创建了不同的函数定义。在运行时它的性能较差,相当于Enum.member?,尽管它们适用于小的n。对于较大的 n 和紧凑的循环,您将从散列值(例如 MapSet.member?)中获得更好的性能。但在大多数情况下,x in yEnum.member? 都可以!

标签: elixir


【解决方案1】:

您可以使用Enum.member?/2

Enum.member?(["foo", "bar"], "foo")
# true

对于元组,您需要先使用 Tuple.to_list/1 转换为列表

Tuple.to_list({"foo", "bar"})
# ["foo", "bar"]

【讨论】:

  • 感谢加兹勒。您的答案是正确的,但我想根据我在社区中收到的所有建议单独发布一个答案。
  • 请注意,您将无法在警卫内使用Enum.member?/2。在这种情况下,您将不得不依赖in。例如:def foo(string) when string in ["one", "two"], do: IO.puts(string)。顺便说一句,这很有趣,因为in 是一个转换为Enum.member?/2 的宏:D
【解决方案2】:

根据此处和 Elixir Slack 中的答案,有多种方法可以检查列表中是否存在项目。 根据@Gazler 的回答:

Enum.member?(["foo", "bar"], "foo")
# true

或者干脆

"foo" in ["foo", "bar"]
# true

Enum.any?(["foo", "bar"], &(&1 == "foo")
# true

或者如果您想查找并返回项目而不是 truefalse

Enum.find(["foo", "bar"], &(&1 == "foo")
# "foo"

如果你想检查一个元组,你需要转换为列表(信用@Gazler):

Tuple.to_list({"foo", "bar"})
# ["foo", "bar"]

但正如 @CaptChrisD 在 cmets 中指出的那样,这是对元组的一种不常见的需求,因为人们通常关心项目在元组中的确切位置以进行模式匹配。

【讨论】:

    【解决方案3】:

    或者直接使用in:

    iex(1)> "foo" in ["foo", "bar"]
    true
    iex(2)> "foo" in Tuple.to_list({"foo", "bar"})
    true
    

    【讨论】:

    • 这个答案就像回答 OP 问题的唯一答案:“......存在于长生不老药列表中”......不是枚举。
    【解决方案4】:

    我昨天开始在 Elixir 中编程,但我会尝试一些我在 JS 中做过很多的事情,也许当列表有很多元素并且你不想一直使用 Enum.member 遍历它时它很有用?

    map_existence = Enum.reduce(list,%{}, &(Map.put(&2,&1,true)))
    map_existence[item_to_check]
    

    您还可以检索与其他列表的交集:

    Enum.filter(some_other_list,&(map_existence[&1]))
    

    【讨论】:

      【解决方案5】:

      你也可以使用Enum.find_value/3

      iex(1)> Enum.find_value(["foo", "bar"],false, fn(x)-> x=="foo" end)
      true
      
      iex(2)> Enum.find_value(["foo", "bar"],false, fn(x)-> x=="food" end)
      false
      

      【讨论】:

        猜你喜欢
        • 2011-06-09
        • 2021-09-14
        • 1970-01-01
        • 2012-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多