Elixir 목록이나 튜플에 항목이 있는지 확인하는 방법은 무엇입니까?


85

이것은 겉보기에 간단 해 보이지만 문서에서 찾을 수없는 것 같습니다. 단순히 반환 true하거나 false항목이 목록 또는 튜플에있는 경우 필요합니다 . 이 Enum.find/3작업을 수행하는 가장 좋은 방법입니까?

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

2
목록의 경우 Enum.member? / 2가 좋은 항목이 있는지 확인하려는 위치를 볼 수 있습니다. 하지만 튜플의 경우 일반적으로 값의 위치, 즉 튜플의 아름다움 중 하나에 관심이 있습니다. 위치에 관심이 없다면 튜플 사용을 고려할 수 있습니다.
CaptChrisD

@Gazler의 답변이 맞다면 수락 된 답변으로 표시 할 수 있습니다.
Onorio Catenacci

1
성능에 대한 빠른 참고. x in y은 컴파일 타임에 다른 기능 정의를 생성하기 때문에 경비가 매우 확대됨에있다. 런타임시에는 성능이 떨어지며,과 동일 Enum.member?하지만 small n 에는 사용하는 것이 좋습니다 . 큰 n 및 타이트 루프의 경우 MapSet.member?. 그러나 대부분의 경우에, x in y그리고 Enum.member?정상입니다!
Dennis

답변:


130

당신이 사용할 수있는 Enum.member?/2

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

튜플을 사용하면 먼저 다음을 사용하여 목록으로 변환하고 싶을 것입니다. Tuple.to_list/1

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

고마워 Gazler. 귀하의 답변은 정확하지만 커뮤니티에서받은 모든 제안을 바탕으로 별도의 답변을 게시하고 싶었습니다.
ewH

Enum.member?/2가드 내부에서는 사용할 수 없습니다 . 이 경우 in. 예 : def foo(string) when string in ["one", "two"], do: IO.puts(string). 그건 그렇고, 이것은 재밌습니다. 왜냐하면 다음 in과 같이 번역되는 매크로 이기 때문 입니다 Enum.member?/2. D
Alessandro

39

여기와 Elixir Slack의 답변을 기반으로 목록에 항목이 있는지 확인하는 여러 방법이 있습니다. @Gazler의 답변 :

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

또는 단순히

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

또는

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

또는 당신이 찾아 대신 항목을 반환하려는 경우 true또는false

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

튜플을 확인하려면 목록으로 변환해야합니다 (credit @Gazler).

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

그러나 @CaptChrisD가 주석에서 지적했듯이 이것은 일반적으로 패턴 일치를 위해 튜플에서 항목의 정확한 위치에 관심이 있기 때문에 튜플에 대한 드문 필요입니다.


26

또는 다음을 사용하십시오 in.

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

이 대답은 OP의 질문에 대답 한 유일한 것과 같습니다 : "... exists in an elixir LIST"... enum이 아닙니다.
Daniel Lizik

2

어제 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]))

1

다음을 사용할 수도 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.