2017-12-27 156 views
6

मैं उदाहरण के लिए दो सूचियों मिल गया है,:पायथन में एक्सओआर दो सूचियों को कैसे करें?

a = ['hello','world'] 
b = ['hello','world','im','steve'] 

मैं एक तीसरी सूची है कि केवल तत्वों दोनों में नहीं होता है बनाना चाहते हैं:

c = ['im','steve'] 

मैं अगर ऐसा कैसे करते हैं तत्वों का महत्वपूर्ण है? मुझे पता है कि मैं सेट का उपयोग कर सकता हूं लेकिन वे मेरी सूचियों के क्रम को फेंकते रहते हैं। मैं स्ट्रिंग्स में कनवर्ट करने के लिए ' '.join(list) का उपयोग कर सकता हूं लेकिन यह सुनिश्चित नहीं करता कि इस प्रारूप में या तो इस ऑपरेशन को कैसे करें।

+4

तो आदेश * है * महत्वपूर्ण है, तुम क्या करते हो जब 'A' है, जैसे,' [ 'हैलो', '', 'दुनिया'] 'या' [ 'दुनिया', 'हैलो' ] '? क्या होगा यदि यह '[' दुनिया ',' हैलो ',' दुनिया '] 'है? क्या होगा यदि इसमें कहीं 'स्टीव' है, तो क्या इससे कोई फर्क पड़ता है? – torek

+4

संभावित डुप्लिकेट [दो सूचियों की तुलना और केवल अंतर को मुद्रित करना? (दो सूचियों को XORING)] (https://stackoverflow.com/questions/16312730/comparing-two-lists-and-only-printing-the-differences-xoring-two-lists) – Copperfield

उत्तर

13

आप सूचियों और उपयोग सूची समझ जोड़ सकते हैं:

a = ['hello','world'] 
b = ['hello','world','im','steve'] 
final_vals = [i for i in a+b if i not in a or i not in b] 

आउटपुट:

['im', 'steve'] 
4

दो सूचियों को एक साथ जोड़ें और शून्य से चौराहे हिस्सा अगर यह नई सूची में पता चलता है। आदेश संरक्षित है।

c = a + b 
for v in set(a).intersection(set(b)): 
    while v in c: 
     c.remove(v) 
+1

प्रश्न से: "मैं कैसे करूँ यदि तत्वों का क्रम महत्वपूर्ण है तो ऐसा करें? " – viraptor

+0

अब इसे फिट करने के लिए संपादित करेंगे। क्या आप डाउनवोट हटा सकते हैं? @viraptor – Tai

+1

हालांकि यह पुनरावृत्ति को अनदेखा करता है। उदाहरण के लिए 'ए = [1, 1, 2, 3]; बी = [1, 2] 'वापस आएगा' सी = [3, 1] ' – viraptor

2

सवाल है, स्पष्ट नहीं है वास्तव में, और शायद आप @ Ajax1234 के answer साथ अच्छा कर रहे हैं, लेकिन यहाँ एक और उस पर "ले" है।

यदि आप पदों की तुलना करना चाहते हैं (थोड़ी-थोड़ी बुद्धिमान एक्सओआर क्या करेगी) तो आप सबसे छोटी सूची प्राप्त करने की तरह कुछ कर सकते हैं, सबसे लंबी सूची के साथ स्थिति द्वारा पुनरावृत्ति जांच स्थिति (सबसे लंबी सूची मैचों में एक ही स्थिति की जांच करें सबसे छोटी सूची में शब्द) और फिर शेष सूची जोड़ें ("अनदेखा" सबसे लंबी सूची का हिस्सा)। निम्नलिखित की तरह कुछ:

a = ['hello', 'world'] 
b = ['hello', 'world', 'im', 'steve'] 

min_list = a if len(a) < len(b) else b 
max_list = b if len(b) > len(a) else a 

results = [] 
for i, item in enumerate(min_list): 
    # Iterate through the shortest list to avoid IndexError(s) 
    if min_list[i] != max_list[i]: 
     results.append(min_list[i]) 
     results.append(max_list[i]) 
results.extend(max_list[i + 1:]) 
print(results) 
# Prints: ['im', 'steve'] 

हालांकि, यदि आपको एक ही स्थिति मेल नहीं खाती है तो आपको क्या करना है, इसकी समस्या है। मेरा मतलब है ... उस मामले में क्या करना है?उपरोक्त कोड में, मैं सिर्फ results सूची में दोनों प्रविष्टियाँ कहा, निम्नलिखित जानकारी के लिए, जिसका अर्थ है:

a = ['hello', 'foo'] 
b = ['hello', 'world', 'im', 'steve'] 

उत्पादन होगा:

>>> ['foo', 'world', 'im', 'steve'] 

(नोटिस सूची a से दोनों foo और world सूची से b जोड़ दिया गया है)

+1

यदि आप 'ज़िप' का उपयोग करते हैं तो आपको सूची के आकार की जांच करने की आवश्यकता नहीं है, आप भी सबसे लंबी सूची का चयन करने के लिए 'अधिकतम' का उपयोग कर सकते हैं, या 'क्रमबद्ध' दोनों को एक साथ – Copperfield

3

तुम भी सिर्फ एक समारोह है कि l1 से filters तत्वों है कि में मौजूद नहीं है बना सकते हैं l2, और यह दो बार फोन तर्क के साथ फ़्लिप:

a = ['hello','world', 'foo'] 
b = ['hello','world','im','steve'] 

def difference(l1, l2): 
    return list(filter(lambda x: x not in l2, l1)) 

print(difference(a, b) + difference(b, a)) 
# ['foo', 'im', 'steve'] 

आप filter() उपयोग करना चाहते हैं नहीं है, तो इस तरह एक साधारण सूची समझ भी काम करता है:

[item for item in l1 if item not in l2] 
2

जाँच करने के लिए मानक for पाश का उपयोग करना मदों के लिए नहीं में एक या अन्य सूची (सूची समझ की तुलना में अधिक समझ में आता है हो सकता है):

a = ['hello','world', 'foo'] 
b = ['hello','world','im','steve'] 
c = a+b 
ans = [] 
for i in c: 
    if i not in a or i not in b: 
     ans.append(i) 
print(ans) 

आउटपुट:

['foo', 'im', 'steve'] 
+0

कहां से" foo "आते हैं आपके आउटपुट में से? – pylang

+0

मैंने ऊपर अपनी सूचियां जोड़ दी हैं। – rnso

3
a = ['hello','world'] 
b = ['hello','world','im','steve'] 
a = set(a) 
b = set(b) 
print(a.symmetric_difference(b)) 

इस कोड को प्रिंट तत्वों है कि केवल तालिकाओं में से एक रहे हैं।

यहाँ देखो: https://learnpython.org/en/Sets

+1

सेट ऑर्डर बनाए रखने के लिए सेट नहीं करते हैं। – pylang

6

अजगर सेट एक symmetric_difference विधि है कि या तो a या b से तत्वों वापसी है, लेकिन दोनों से नहीं। आदेश a + b पर एक समेकित सूची के लिए सूची समझ के साथ आदेश संरक्षित किया जा सकता है।

comp = set(a).symmetric_difference(b) 
[x for x in a + b if x in comp] 
# ['im', 'steve'] 
+0

आपको 'सेट (ए) .symmetric_difference (बी)' precompute है या यह धीमा हो जाएगा। –

+0

@ जीन-फ्रैंकोइसफैबर ने पुष्टि की। अद्यतन पोस्ट धन्यवाद। – pylang

संबंधित मुद्दे