Python:变量表示为元组列表的表达式,组合类似的术语:逻辑问题



逻辑在某些方面是有缺陷的。这是我在SO上提出的第一个问题。无论如何,在这里:

所以一个列表被传递到函数中,列表表示一个非简化的表达式,如
2x-5y-3x+7y+3z+6z = [(2,'x'),(-5,'y'),(-3,x),(7,'y'),(3,'z'),(6,'z')]
并且我必须组合类似的术语并返回一个带有简化表达式的列表,在这种情况下将[(-1,'x),(4,'y'),(9,'z')]

回溯错误指出我用作索引的迭代器越界,不知道如何,因为我只从0开始步进一次,直到length of the list-1

def groupLikeTerms(exp):
   newlist=[]
   sumVar=0
   for x in range(0,len(exp)-1,1):
      Letter=exp[x][1]
      if Letter in newlist:
        continue
      else:
        for x2 in range(0,len(exp)-1,1):
          if exp[x2][1]==Letter:
            sumVar+=exp[x2][0]
        newlist.append([(sumVar,Letter)])
  exp=newlist[:]
  return exp

您可以使用itertools.groupby

import itertools
s = [(2,'x'),(-5,'y'),(-3,'x')]
final_data = [(a, sum(i[0] for i in list(b))) for a, b in itertools.groupby(sorted(s, key=lambda x:x[-1]), key=lambda x:x[-1])]

输出:

[('x', -1), ('y', -5)]
编辑:

使用最近一次编辑的数据:

s = [(2,'x'),(-5,'y'),(-3,'x'),(7,'y'),(3,'z'),(6,'z')] 
final_data = [(a, sum(i[0] for i in list(b))) for a, b in itertools.groupby(sorted(s, key=lambda x:x[-1]), key=lambda x:x[-1])]

输出:

[('x', -1), ('y', 2), ('z', 9)]

只是使用collections.defaultdict(int)的另一种方式

from collections import defaultdict
l = [(2,'x'),(-5,'y'),(-3,'x')] 
d_dict = defaultdict(int)
for k, v in l:
    d_dict[v]+=k
[(v,k) for k,v in d_dict.items()]
#Output:
#[(-1, 'x'), (-5, 'y')]

最新更新