2011-11-19 9 views
7

में दो सूचियों घटाना कैसे मैं समझ नहीं कैसे अजगर में एक समारोह है कि इस गणना कर सकते हैं बनाने के लिए:अजगर

List1=[3,5,6] 
List2=[3,7,2] 

और परिणाम एक नई सूची List1 से List2 substracts होना चाहिए, List3=[0,-2,4] ! मुझे पता है, कि मुझे किसी भी तरह ज़िप-फ़ंक्शन का उपयोग करना है। ऐसा करने से मुझे मिलता है: ([(3,3), (5,7), (6,2)]), लेकिन मुझे नहीं पता कि अब क्या करना है?

उत्तर

15

इस प्रयास करें:

[x1 - x2 for (x1, x2) in zip(List1, List2)] 

यह zip, सूची comprehensions, और destructuring उपयोग करता है।

+0

मैं इस तरह से यह करने के लिए की तरह में यह कर सकते हैं .. मैं सिर्फ यह काम करने के लिए (मैं हेवन 'नहीं मिल सकता है बहुत लंबे समय तक अजगर में काम नहीं कर रहा है)! मैंने यह किया: डीफ़ मतभेद (xs, ys): [x1-x2 (x1, x2) ज़िप (xs, ys)] में? –

+0

मैंने ज़िप (सूची 1, सूची 2) में [xp, x2) (x1, x2) के लिए [np.subtract (x1, x2) का उपयोग किया] और यह काम किया! – Alex

6

आप list comprehension का उपयोग कर सकते हैं, जैसा कि @Matt ने सुझाव दिया था। आप भी उपयोग कर सकते हैं itertools - अधिक विशेष रूप से, imap() समारोह:

>>> from itertools import imap 
>>> from operator import sub 
>>> a = [3,5,6] 
>>> b = [3,7,2] 
>>> imap(int.__sub__, a, b) 
<itertools.imap object at 0x50e1b0> 
>>> for i in imap(int.__sub__, a, b): 
...  print i 
... 
0 
-2 
4 

सभी itertools funcitons की तरह, imap() पुनरावर्तक देता है।

>>> list(imap(int.__sub__, a, b)) 
[0, -2, 4] 
>>> list(imap(lambda m, n: m-n, a, b)) # Using lambda 
[0, -2, 4] 

संपादित:: आप list() निर्माता के लिए एक पैरामीटर के रूप में यह गुजर एक सूची उत्पन्न कर सकते हैं नीचे @Cat ने सुझाव दिया है, यह imap() साथ operator.sub() समारोह का उपयोग करने के लिए बेहतर होगा:

>>> from operator import sub 
>>> list(imap(sub, a, b)) 
[0, -2, 4] 
+4

'operator.sub'' int .__ sub__' से अधिक सामान्य है। और कम अंडरस्कोर है। 'ऑपरेटर' –

+0

@CatPlusPlus +1। मैंने इसे जवाब में जोड़ा। – starrify

+0

@CatPlusPlus उत्कृष्ट सुझाव के लिए – brandizzi

3

फिर भी एक और नीचे समाधान:

>>> a = [3,5,6] 
>>> b = [3,7,2] 
>>> list(map(int.__sub__, a, b)) # for python3.x 
[0, -2, 4] 
>>> map(int.__sub__, a, b) # and for python2.x 
[0, -2, 4] 

अलावा: बस python reference of map के लिए जाँच करें और आप आप map

+2

मुझे नहीं पता था कि 'नक्शा()' एक से अधिक पुनरावृत्त स्वीकार करता है। यह भी खूब रही! – brandizzi

9

यह समाधान numpy का उपयोग करता है करने के लिए एक से अधिक iterable गुजारें सकता देखेंगे। यह केवल बड़े पैमाने पर सूचियों के लिए समझ में आता है क्योंकि numpy arrays को तत्काल में कुछ ओवरहेड होता है। ओटीओएच, छोटी सूची के अलावा कुछ भी के लिए, यह तेजी से तेज होगा।

>>> import numpy as np 
>>> a = [3,5,6] 
>>> b = [3,7,2] 
>>> list(np.array(a) - np.array(b)) 
[0, -2, 4] 
0

आप निम्नलिखित तरीके

List1 = [3,5,6] 
List2 = [3,7,2] 
ans = [List1[i]-List2[i] for i in xrange(min(len(List1), len(List2)))] 
print ans 

आउटपुट कि [0, -2, 4]