逻辑在某些方面是有缺陷的。这是我在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')]