अजगर में सरणी फ़िल्टर?


85

उदाहरण के लिए, मेरे पास दो सूचियाँ हैं

 A           = [6, 7, 8, 9, 10, 11, 12]
subset_of_A  = [6, 9, 12]; # the subset of A


the result should be [7, 8, 10, 11]; the remaining elements 

क्या ऐसा करने के लिए अजगर में एक अंतर्निहित कार्य है?

जवाबों:


119

यदि आदेश महत्वपूर्ण नहीं है, तो आपको उपयोग करना चाहिए set.difference। हालाँकि, यदि आप ऑर्डर को बनाए रखना चाहते हैं, तो एक साधारण सूची की समझ है।

result = [a for a in A if a not in subset_of_A]

EDIT: जैसा कि डेलन का कहना है, अगर सूची के लिए O (n) की तुलना में, O (1) में सदस्यता की जाँच के बाद से प्रदर्शन में काफी सुधार होगा, तो subset_of_Aयह वास्तविक है ।setset

A = [6, 7, 8, 9, 10, 11, 12]
subset_of_A = set([6, 9, 12]) # the subset of A

result = [a for a in A if a not in subset_of_A]

14
और इसे subset_of_Aवास्तविक रूप से बेहतर बनाया जा सकता है set, जो O(1)सदस्यता परीक्षण देता है ( O(n)सूचियों के बजाय )।

55

हाँ, filterसमारोह:

filter(lambda x: x not in subset_of_A, A)

8
ध्यान दें कि पायथन 2 में, filterसूची को स्वयं लौटाता है, जबकि पायथन 3 में, यह एक पुनरावृत्ति देता है।
modulitos

13
@ मोदुलितोसlist(filter(...))
पावेल

7

नहीं, ऐसा करने के लिए अजगर में कोई फ़ंक्शन नहीं है, क्योंकि बस:

set(A)- set(subset_of_A)

आपको उत्तर प्रदान करेगा।


1
जबकि यह उनके उदाहरण के लिए काम करता है, अगर ए सूची में तत्वों को दोहराया जाता है तो समस्याएं हो सकती हैं
आलोक मैसूर

6

set(A)-set(subset_of_A)आपका इच्छित परिणाम सेट करता है, लेकिन यह मूल आदेश को बरकरार नहीं रखेगा। निम्नलिखित क्रम संरक्षण है:

[a for a in A if not a in subset_of_A]



3

यह सिर्फ एक दो दिन पहले पूछा गया था (लेकिन मुझे यह नहीं मिला):

>>> A = [6, 7, 8, 9, 10, 11, 12]
>>> subset_of_A = set([6, 9, 12])
>>> [i for i in A if i not in subset_of_A]
[7, 8, 10, 11]

setसंदर्भ के आधार पर, शुरुआत से ही इसका उपयोग करना बेहतर हो सकता है। फिर आप अन्य जवाब दिखाने जैसे सेट ऑपरेशन का उपयोग कर सकते हैं ।

हालाँकि, सूची को केवल इन ऑपरेशनों के लिए सेट और बैक में परिवर्तित करना सूची समझ से धीमा है।



1
>>> a = set([6, 7, 8, 9, 10, 11, 12])
>>> sub_a = set([6, 9, 12])
>>> a - sub_a
set([8, 10, 11, 7])

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