1

Python3で2つの多項式(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

(3, -6)しかし、私の問題は、-6x^3と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

これは、以下を使用して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 に答える