如果项目相同,如何在元组列表中添加项目

时间:2013-02-28 23:59:16

标签: list python-3.x tuples polynomial-math

我正在尝试在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 + 9x ^ 2 + 8x ^ 3-12x

但我的问题是我无法找到一种方法来'添加'具有相同第一个元素的元组,你可以看到-6x ^ 3 (3, -6)和8x ^ 3 {{1} }。

是否有“Pythonic”方式来实现这一目标?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 ming组中的值(忽略键):

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