यह जांचने के लिए कि क्या कोई वस्तु अमृत सूची या टपल में मौजूद है?


85

यह सरल प्रतीत होता है, लेकिन मैं इसे डॉक्स में नहीं ढूंढ सकता। मुझे बस वापस लौटने की ज़रूरत है trueया falseयदि कोई सूची या टपल में कोई आइटम मौजूद है। क्या Enum.find/3वास्तव में ऐसा करने का सबसे अच्छा तरीका है?

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

2
एक सूची के लिए मैं देख सकता हूं कि आप यह देखना चाहते हैं कि क्या आइटम वहां है जिसमें Enum.member? / 2 अच्छा होगा। लेकिन टुपल के लिए आप आमतौर पर मूल्य की स्थिति के बारे में परवाह करते हैं, जो कि
टुपल्स

यदि आप सही हैं तो आप स्वीकार किए गए उत्तर के रूप में @ गजलर के उत्तर को चिह्नित करना चाह सकते हैं।
ओनोरियो कैटेनेशिआ

1
प्रदर्शन के बारे में त्वरित ध्यान दें। x in yगार्ड बहुत performant क्योंकि यह संकलन समय पर विभिन्न समारोह परिभाषाओं पैदा करता है। रनटाइम के दौरान, यह कम प्रदर्शन करने वाला है Enum.member?, हालांकि वे छोटे n के लिए उपयोग करने के लिए ठीक हैं । बड़े एन और तंग छोरों के लिए, आपको उस चीज़ से बेहतर प्रदर्शन मिलेगा, जैसे कि हैश MapSet.member?। लेकिन ज्यादातर मामलों में, x in yऔर Enum.member?ठीक हैं!
डेनिस

जवाबों:


130

आप उपयोग कर सकते हैं Enum.member?/2

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

एक टुपल के साथ आप पहली बार उपयोग कर एक सूची में परिवर्तित करना चाहेंगे Tuple.to_list/1

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

धन्यवाद गजलर आपका उत्तर सही है, लेकिन मैं समुदाय के चारों ओर प्राप्त सभी सुझावों के आधार पर एक अलग उत्तर पोस्ट करना चाहता था।
ewH

ध्यान दें कि आप Enum.member?/2किसी गार्ड के अंदर उपयोग करने में सक्षम नहीं होंगे । उस स्थिति में, आपको भरोसा करना होगा in। उदाहरण के लिए def foo(string) when string in ["one", "two"], do: IO.puts(string):। वैसे, यह मज़ेदार है, क्योंकि inएक मैक्रो है जो अनुवाद करता है Enum.member?/2: D
Alessandro

39

यहां और अमृत स्लैक के उत्तरों के आधार पर, यह जांचने के कई तरीके हैं कि क्या कोई आइटम किसी सूची में मौजूद है। @ ग़ज़लर द्वारा प्रति उत्तर:

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"

यदि आप एक टपल की जाँच करना चाहते हैं, तो आपको सूची में परिवर्तित करना होगा (क्रेडिट @ गजलर):

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

यह उत्तर केवल उसी की तरह है जो ओपी के प्रश्न का उत्तर देता है: "... एक अमृत में मौजूद है" ... एक एनम नहीं।
डैनियल लिज़िक

2

मैंने कल अमृत में प्रोग्रामिंग शुरू की, लेकिन मैं जेएस में बहुत कुछ करने की कोशिश करूंगा, शायद यह तब उपयोगी है जब सूची में बहुत सारे तत्व हैं और आप एनुमम्बर का उपयोग करके इसे हर समय नहीं करना चाहते हैं?

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

आप किसी अन्य सूची के साथ एक प्रतिच्छेदन भी प्राप्त कर सकते हैं:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.