KK Sasa wrote: > Hi there, > > The list comprehension is results = [d2(t[k]) for k in xrange(1000)], > where d2 is a function returning a list, say [x1,x2,x3,x4] for one > example. So "results" is a list consisting of 1000 lists, each of length > four. Here, what I want to get is the sum of 1000 lists, and then the > result is a list of length four. Is there any efficient way to do this? > Because I found it is slow in my case. I tried sum(d2(t[k]) for k in > xrange(1000)), but it returned error: TypeError: unsupported operand > type(s) for +: 'int' and 'list'. Thanks.
That's because sum() defaults to adding with a default value of 0: py> sum([[1, 2], [3, 4]], 0) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'int' and 'list' py> sum([[1, 2], [3, 4]], []) [1, 2, 3, 4] But don't do that! It will be slow. I don't completely understand your requirements. You should show some typical data, and the expected result. The business with the xrange and t[k] and even d2() is probably irrelevant. The important part is summing the lists. That could mean either of these two things: results = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] sum(results) --> gives [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] The way to do this efficiently is: results = [] for sublist in [d2(t[k]) for k in xrange(1000)]: results.extend(sublist) Or perhaps you mean this: results = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] sum(results) --> gives [15, 18, 21, 24] I expect that the fastest, most efficient way to do this will be with the third-party library numpy. But in pure Python, you can do this: def add(alist, blist): if len(blist) != len(alist): raise ValueError for i, x in blist: alist[i] += x results = [0]*4 # Like [0,0,0,0] for sublist in [d2(t[k]) for k in xrange(1000)]: add(results, sublist) -- Steven -- https://mail.python.org/mailman/listinfo/python-list