2013-02-28 9 views
1

Я пытаюсь умножить два многочлена в Python3 (2x^3-3x^2 + 4x * 2x^2-3 = 4x^5-6x^4 + 2x^3 + 9x^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 + 9х^2 + 8х^3-12x

Но моя проблема в том, что я не могу найти способ 'добавить' кортежи, которые имеют один и тот же первый e как вы можете видеть с -6x^3 (3, -6) и 8x^3 (3, 8).

Существует ли «питонический» способ достичь этого?

ответ

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 comprehension, sum мина значения в группе (не обращая внимания на ключ):

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

Это было именно то, что я хотел! Большое вам спасибо, мне не нужно его убирать, потому что это всего лишь домашняя работа для моего класса алгоритмов, и я не мог заставить свой код работать. Большое спасибо! –

+0

@Jose_Sunstrider: Если бы вы отправили код, который не мог работать, мы могли бы помочь вам исправить это! Вы получите лучшее представление о достижении кода, который вы сами написали! – Johnsyweb

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 
Смежные вопросы