Python:用元组列表表示变量的表达式,结合类似的术语:Logic issu

2024-09-30 18:22:46 发布

您现在位置:Python中文网/ 问答频道 /正文

逻辑在某些方面有缺陷。这是我第一个这样问的问题。总之,这里:

因此,一个列表被传递到函数中,该列表表示一个未简化的表达式,如
2x-5y-3x+7y+3z+6z = [(2,'x'),(-5,'y'),(-3,x),(7,'y'),(3,'z'),(6,'z')]
我必须组合like术语并返回一个带有简化表达式的列表,在本例中是[(-1,'x),(4,'y'),(9,'z')]。你知道吗

回溯错误表明我的迭代器(我正在使用它作为索引)超出了界限,不确定如何执行,因为我只从0length 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

Tags: 函数in列表forlenif表达式range
2条回答

只是使用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')]

您可以使用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)]

相关问题 更多 >