2013-02-28 58 views
1

我想在Python3中乘以兩個多項式(2x^3-3x^2 + 4x * 2x^2-3 = 4x^5-6x^4 + 2×^ 3 + 9倍^ 2-12x)和來表示我使用的元組(exponent, variable)多項式,所以上述操作是:[(3,2), (2,-3), (1,4)] * [(2,2), (0, -3)]如何在元組列表中添加項目如果項目是相同的

而且我得到下一list作爲一個答案: [(5, 4), (3, -6), (4, -6), (2, 9), (3, 8), (1, -12)]

這將是:4X^5-6x^3-6x^4 + 9X^2 + 8X^3-12x

但我的問題是,我無法找到一個方法來 '添加'具有相同的第一個e的元組如你所見-6x^3 (3, -6)和8x^3 (3, 8)

是否有一種「Pythonic」方法來實現這一目標?

回答

1

這可以使用itertools.groupby()一行來完成:

>>> [(exponent, sum(value for _, value in values)) for exponent, values in groupby(sorted(l, key=itemgetter(0)), key=itemgetter(0))] 
[(1, -12), (2, 9), (3, 2), (4, -6), (5, 4)] 

分解成一些更可讀(readability counts)...

導入工具:

>>> from itertools import groupby 
>>> from operator import itemgetter 
>>> 

的聲明輸入(你已經完成了這一點):

>>> l = [(5, 4), (3, -6), (4, -6), (2, 9), (3, 8), (1, -12)] 
>>> 

之前,我們可以組,我們需要進行排序(上在tuple的第一項):

>>> l_sorted = sorted(l, key=itemgetter(0)) 
>>> 

然後組(再次,通過第一項):

>>> l_grouped = groupby(l_sorted, key=itemgetter(0)) 
>>> 

然後創建一個list comprehensionsum明組中的值(忽略鍵):

>>> [(exponent, sum(v for _,v in values)) for exponent, values in l_grouped] 
[(1, -12), (2, 9), (3, 2), (4, -6), (5, 4)] 
+0

這也正是我想要的!非常感謝,我不需要整理它,因爲它只是我的算法類的作業,而且我無法讓我的代碼正常工作。非常感謝你! – 2013-03-01 00:47:51

+0

@Jose_Sunstrider:如果你發佈了你無法工作的代碼,我們可以幫你修復它!你會從自己編寫的代碼中獲得更好的成就感! – Johnsyweb 2013-03-01 00:51:48

2

我會從列表切換到字典。爲了讓另外更容易,我會使用defaultdict

from collections import defaultdict 

poly = defaultdict(int) 

,然後添加這些元組到字典:

for exponent, variable in poly_list: 
    poly[exponent] += variable 

它那種工作:

>>> from collections import defaultdict 
>>> 
>>> poly = defaultdict(int) 
>>> 
>>> for poly_list in [[(1, 1)], [(1, 1)]]: 
...  for exponent, variable in poly_list: 
...   poly[exponent] += variable 
... 
>>> poly 
    defaultdict(<type 'int'>, {1: 2}) 
>>> poly.items() 
    [(1, 2)] 

雖然就個人而言,我只會讓一個Polynomial類:

class Polynomial(object): 
    def __init__(self, terms=None): 
     if isinstance(terms, dict): 
      self.terms = terms 
     else: 
      self.terms = dict(terms) or {} 

    def copy(self): 
     return Polynomial(self.terms.copy()) 

    def __add__(self, other): 
     result = self.copy() 

     for e, c in self.terms.items(): 
      result[e] = self.get(e, 0) + c 

     return result 

    def __mul__(self, other): 
     result = self.copy() 

     for e1, c1 in self.terms.items(): 
      for e2, c2 in other.terms.items(): 
       result[e1 + e2] = self.get(e1, 0) * other.get(e2, 0) 

     return result 
相關問題