2010-04-24 2 views
5

में अन्य सरणी के साथ सरणी का उपयोग करना किसी अन्य सरणी में वस्तुओं के सभी उदाहरण निकालने का एक प्रभावी तरीका खोजने का प्रयास करना।पायथन

उदाहरण

array1 = ["abc", "def", "ghi", "jkl"] 

array2 = ["abc", "ghi", "456", "789"] 

सरणी 1 के लिए आइटम सरणी 2. इस प्रकार से बाहर निकाले जाने की आवश्यकता है कि की एक सरणी है, श्रेणी 2, ["456", "789"]

मैं ऐसा करने के तरीके पता करने के लिए संशोधित किया जाना चाहिए लेकिन एक कुशल तरीके से नहीं।

उत्तर

6

ये सूचियां हैं, सरणी नहीं। (शब्द "सरणी" अलग अलग लोगों को अलग अलग बातें मतलब है, लेकिन अजगर में खुद वस्तुओं सूचियों कहते हैं, और कि कि है, इस तरह के array और numpy के रूप में अन्य मॉड्यूल है कि वस्तुओं कि खुद को कॉल सरणियों प्रदान करते हैं देखते हैं)

उत्तर देने के लिए आपका प्रश्न, सबसे आसान तरीका एरे 2 को संशोधित नहीं करना है। एक सूची समझ का उपयोग करें:

set1 = set(array1) 
array2 = [e for e in array2 if e not in set1] 

(सेट इस O (n बनाता है) हे के बजाय (एन^2))

तो आप पूरी तरह चाहिए मे बदलें array2 (क्योंकि इसे कहीं मौजूद है), तो आप टुकड़ा असाइनमेंट का उपयोग कर सकते हैं:

array2[:] = [e for e in array2 if e not in set1] 

यह उतना ही कुशल, लेकिन प्रकार का बुरा है।

संपादित करें: मार्क बेयर्स बताते हैं, यह केवल तभी काम करता है जब सरणी 1 में केवल हेशेबल तत्व होते हैं (जैसे स्ट्रिंग्स, संख्याएं इत्यादि)।

+2

यदि आपको डुप्लीकेट या ऑर्डर की परवाह नहीं है तो आपको 'सेट (array2) - सेट (array2) 'पर विचार करना चाहिए। – Jules

3

यदि आपकी सूचियों में डुप्लिकेट नहीं हो सकते हैं और आपको ऑर्डर की परवाह नहीं है तो आपको सूचियों के बजाय सेट का उपयोग करना चाहिए (वैसे, उन्हें सूचियां कहा जाता है, सरणी नहीं)।

>>> set1 = set(["abc", "def", "ghi", "jkl"]) 
>>> set2 = set(["abc", "ghi", "456", "789"]) 
>>> set2 - set1 
set(['456', '789']) 

List2 डुप्लिकेट या आदेश मामलों को शामिल कर सकते हैं तो आप अभी भी खोज के तेजी लाने के लिए एक सेट List1 कर सकते हैं:

>>> list1 = ["abc", "def", "ghi", "jkl"] 
>>> list2 = ["abc", "ghi", "456", "789"] 
>>> set1 = set(list1) 
>>> [a for a in list2 if a not in set1] 
['456', '789'] 

नोट तो क्या आप चाहते हैं लागू करने के लिए दोनों तेजी से और तुच्छ है यह आवश्यक है कि आइटम हर्षनीय हैं लेकिन ओ (एन) समय के करीब चलता है।

यदि आइटम हैंशबल नहीं हैं लेकिन वे ऑर्डर करने योग्य हैं तो आप सूची 1 को सॉर्ट कर सकते हैं और इसमें आइटम ढूंढने के लिए बाइनरी खोज का उपयोग कर सकते हैं। यह ओ (एन लॉग (एन)) समय देता है।

यदि आपके आइटम न तो हैंशबल योग्य नहीं हैं तो आपको प्रत्येक तत्व के लिए धीमी ओ (एन * एन) सरल रैखिक खोज का सहारा लेना होगा।

+0

और अगर आप आदेश की परवाह नहीं करते है। –

+0

नहीं .. दोनों के बीच का अंतर नहीं चाहते हैं। हालांकि यह सटीक परिदृश्य नहीं है ... खराब शब्दों की सूची के रूप में सरणी 1 की चीज, खोजशब्दों की सूची के रूप में सरणी दो। मैं सरणी 1 में मास्टर सूची से सभी बुरे शब्दों के साथ खोजशब्दों का परिणाम प्राप्त करना चाहता हूं। – Scott

+0

@ थॉमस: धन्यवाद, मैंने उस बिंदु को मेरे उत्तर में शामिल किया है। –

0

सीधा तरीका कुछ ऐसा होगा;

array2 = [i for i in array2 if i not in array1] 

सूची comprehensions आप यहाँ क्या जरूरत है