【问题标题】:How to add items in a list of tuples if the item is the same如果项目相同,如何在元组列表中添加项目
【发布时间】:2013-02-28 23:59:15
【问题描述】:

我正在尝试将 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 (3, 8) 相同的第一个元素的元组。

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

【问题讨论】:

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


    【解决方案1】:

    我会从列表切换到字典。为了使添加更容易,我会使用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
    

    【讨论】:

      【解决方案2】:

      这可以使用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 comprehensionsumming 组中的值(忽略键):

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

      【讨论】:

      • 这正是我想要的!非常感谢,我不需要整理它,因为它只是我的算法课的作业,我无法让我的代码工作。非常感谢!
      • @Jose_Sunstrider:如果您发布了无法开始工作的代码,我们本可以帮助您修复它!你会从自己编写的代码中获得更好的成就感!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 2022-09-30
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      • 2021-07-13
      • 2021-11-04
      相关资源
      最近更新 更多