2013-05-14 13 views
5

जोड़ना मैं बस सोच रहा था कि क्या दो tuples तत्व के रूप में जोड़ने का एक विशेष रूप से पाइथनिक तरीका था?दो tuples तत्ववार

अब तक (ए और बी tuples कर रहे हैं), मैं

map(sum, zip(a, b)) 

मेरे उम्मीद उत्पादन होगा:

(a[0] + b[0], a[1] + b[1], ...) 

और एक संभव वजन 0.5 वजन और ख 0.5 देने के लिए किया जाएगा वजन, या इतने पर। (मैं भारित औसत लेने की कोशिश कर रहा हूं)।

जो ठीक काम करता है, लेकिन कहें कि मैं भार जोड़ना चाहता हूं, मुझे पूरा यकीन नहीं है कि मैं यह कैसे करूंगा।

धन्यवाद

+0

क्या आपके अपेक्षित आउटपुट तो है? – msvalkon

+1

आप * अपने 'ए' और 'बी' tuples तत्व के अनुसार प्रसंस्करण कर रहे हैं। आप एई के लिए 'tuple (sum (aa, bb) भी कर सकते हैं, ज़िप (ए, बी) में बीबी)' दो तत्वों को अलग-अलग चरों में अनपैक करने के लिए। आपका भारोत्तोलन सूत्र क्या होगा? –

+0

और उस मामले के लिए केवल 'sum (i)' (या 'sum (aa, bb)' के बजाय), आप अन्य तत्व बनाने के लिए * * अलग * अभिव्यक्ति का उपयोग कर सकते हैं। योग और अन्य मूल्य दोनों के साथ एक टुपल सहित: '(योग (एए, बीबी), एए/बीबी) उदाहरण के लिए। –

उत्तर

13

उन्हें ज़िप, फिर प्रत्येक ट्यूपल को जोड़ दें।

[sum(x) for x in zip(a,b)] 

संपादित करें: यहाँ एक बेहतर, अधिक जटिल संस्करण है कि भार के लिए अनुमति देता है यद्यपि है।

from itertools import starmap, islice, izip 

a = [1, 2, 3] 
b = [3, 4, 5] 
w = [0.5, 1.5] # weights => a*0.5 + b*1.5 

products = [m for m in starmap(lambda i,j:i*j, [y for x in zip(a,b) for y in zip(x,w)])] 

sums = [sum(x) for x in izip(*[islice(products, i, None, 2) for i in range(2)])] 

print sums # should be [5.0, 7.0, 9.0] 
+0

क्या वह अभी इसमें नहीं है सूची फार्म? – squiguy

+0

नहीं, क्योंकि वह * * * * के साथ "योग" को प्रतिस्थापित कर सकता है .8 * x [0] + .2 * x [1] – Crisfole

+0

@ क्रिस्टोफरफ़ोफ्ल अच्छा यकीन है, लेकिन मैंने सोचा कि टिप्पणियों में उल्लेख किया गया था। – squiguy

4
>>> a = (1, 2, 3) 
>>> b = (4, 5, 6) 
>>> def averageWeightedSum(args): 
     return sum(args)/len(args) 
>>> tuple(map(averageWeightedSum, zip(a, b))) 
(2.5, 3.5, 4.5) 

एक वैकल्पिक पहले भार लागू करने के लिए किया जाएगा।

>>> from operator import mul 
>>> weights = (0.3, 0.7) 
>>> tuple(sum(map(mul, x, weights)) for x in zip(a, b)) 
(3.0999999999999996, 4.1, 5.1) 
>>> weights = (0.5, 0.5) 
>>> tuple(sum(map(mul, x, weights)) for x in zip(a, b)) 
(2.5, 3.5, 4.5) 
2

एक जोड़ा निर्देशांक की भारित योग के लिए सूत्र ले लो, और प्रत्येक जोड़ी (for के बाद दो चर ध्यान दें) पर एक इटरेटर के साथ एक टपल फार्म: यह भी आप अलग अलग वजन है करने की अनुमति होगी:

tuple(0.5*an + 0.5*bn for an, bn in zip(a, b)) 

यह एक-लाइनर के रूप में इसे सरल और पठनीय रखता है। बेशक यदि आपका "भारित योग" एक जटिल कार्य है, तो आप इसे पहले एक अलग कार्य के रूप में परिभाषित करेंगे।

+0

ज़िप में एक्स के लिए tuple (sum (x) (ए, बी)) '** बेहतर है ... और **' tuple (नक्शा (योग, ज़िप (ए, बी))) ** यहां तक ​​कि बेहतर **। – Nawaz

+0

@ नवाज, यह बेहतर क्यों है? मैं कहता हूं कि मैं हूं() 'बदतर है। यदि आप भारित राशि चाहते हैं, तो 'योग()' बेकार है। इसके अलावा, यह स्वाद का विषय है, लेकिन मुझे अनिश्चित संख्या में सारांश होने पर 'sum()' अधिक उपयुक्त लगता है - यहां हमेशा दो शब्द जोड़े जा रहे हैं। प्रत्येक के लिए, मुझे लगता है, लेकिन यह मत भूलना कि भारित योग ओपी के प्रश्न का हिस्सा है। – alexis

+0

ओह .. मैंने वजन नहीं देखा। लेकिन फिर पहला फॉर्म अभी भी काम कर सकता है: ज़िप में एक्स के लिए 'tuple (0.5 * sum (x) (ए, बी))'। यह आपके जैसा ही है, बस यह अधिक कार्यात्मक (और शायद पाइथोनिक भी है)। – Nawaz

2

आप निर्भरता कोई आपत्ति नहीं है, तो आप numpy elementwise के संचालन के लिए सरणियों

पर
>>> import numpy as np 
>>> a = np.array([1, 2, 3]) 
>>> b = np.array([3, 4, 5]) 
>>> a + b 
array([4, 6, 8]) 
0

उपयोग कर सकते हैं अपने tuples str वस्तुओं को शामिल हैं:

list(map(''.join, zip('abc', '123'))) 
# Returns ['a1', 'b2', 'c3']