1

我试图在 Python3 中将两个多项式相乘 (2x^3-3x^2+4x * 2x^2-3 = 4x^5-6x^4+2x^3+9x^2-12x) 并表示多项式我正在使用 tuple (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

但我的问题是我找不到一种方法来“添加”具有与 -6x^3(3, -6)和 8x^3相同的第一个元素的元组(3, 8)

有没有一种“Pythonic”的方式来实现这一点?

4

2 回答 2

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
于 2013-03-01T00:10:57.987 回答
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)]

把它分解成更易读的东西(可读性很重要)......

导入工具:

>>> 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))
>>> 

然后创建一个列表理解sum对组中的值进行铭记(忽略键):

>>> [(exponent, sum(v for _,v in values)) for exponent, values in l_grouped]
[(1, -12), (2, 9), (3, 2), (4, -6), (5, 4)]
于 2013-03-01T00:18:00.610 回答