我正在尝试在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”方式来实现这一目标?
答案 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 comprehension,sum
ming组中的值(忽略键):
>>> [(exponent, sum(v for _,v in values)) for exponent, values in l_grouped]
[(1, -12), (2, 9), (3, 2), (4, -6), (5, 4)]