Re: Simple recursive sum function | what's the cause of the weird behaviour?
I got it! One of the testcases was wrong, ([[1], [1]],[1],[1, 1]), should be ([[1], [1]],[1],[1, 1, 1]), And the working solution. def supersum(sequence, start=0): result = start start = type(start)() for item in sequence: try: item = supersum(item, start) except TypeError: pass try: result = result + item except TypeError: return result + sequence return result I couldn't yet get around doing type(start)() and it's pretty messy, but anyways... -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple recursive sum function | what's the cause of the weird behaviour?
I read through all of the posts and thanks for helping. What was supposed to be simple a (recursively) straightforward, turned out to be quite tricky. I've set up a small testing bench and tried all of the proposed solutions including my own but none pass. I'll post it below. I've also discovered something about lists that explains the very first "weird" result I was observing, which I realized was because lists are mutable etc, but more specifically: This >>> a = [1, 2] >>> a += [3] is equivalent to, AFAIK, this >>> a = [1, 2] >>> a.extend([3]) So to overcome that you just have to do >>> a = [1, 2] >>> a = a + [3] Which creates a new list. So any variables which were pointing to the same list as a, are unaffected. Summary - - - - >>> # --- Bad --- >>> a = [1, 2] >>> b = a >>> a += [3] >>> print a [1, 2, 3] >>> print b [1, 2, 3] >>> # --- Good --- >>> a = [1, 2] >>> b = a >>> a = a + [3] >>> print a [1, 2, 3] >>> print b [1, 2] And as for the testbench: def supersum(seq, start=0): return # Testing > testcases = [ # (seq, start, result) # arithmetic sums ([],0, 0), ([[], []], 0, 0), ([[], [[],[]]], 0, 0), ([1], 0, 1), ([[], [1]], 0, 1), ([[], [[],[1, 1]]], 0, 2), ([[1], [1]],0, 2), ([[1], [[1],[1, 1]]], 0, 4), ([[1], [[1],[1, 1]]], 1, 5), # list flattening ([],[], []), ([[], []], [], []), ([[], [[],[]]], [], []), ([],[1],[1]), ([[], []], [1],[1]), ([[], [[],[]]], [1],[1]), ([1], [1],[1, 1]), ([[1], [1]],[1],[1, 1]), ([[1], [[1],[1]]], [1],[1, 1, 1, 1]), ] for seq, start, result in testcases: try: assert supersum(seq, start) == result except Exception as er: print "seq:%s\t start:%s" % (seq, start) if type(er) is AssertionError: print "expected:", result print "got: ", supersum(seq, start) else: print repr(er) print '' -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple recursive sum function | what's the cause of the weird behaviour?
On 06/07/2013 21:10, Rotwang wrote: [...] It's not quite clear to me what the OP's intentions are in the general case, but calling supersum(item, start) seems odd - for example, is the following desirable? >>> supersum([[1], [2], [3]], 4) 22 I would have thought that the "correct" answer would be 10. How about the following? def supersum(sequence, start = 0): result = start for item in reversed(sequence): try: result = supersum(item, result) except: result = item + result return result Sorry, I've no idea what I was thinking with that reversed thing. The following seems better: def supersum(sequence, start = 0): result = start for item in sequence: try: result = supersum(item, result) except: result = result + item return result -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple recursive sum function | what's the cause of the weird behaviour?
On 06/07/2013 19:43, Joshua Landau wrote: On 6 July 2013 13:59, Russel Walker wrote: Since I've already wasted a thread I might as well... Does this serve as an acceptable solution? def supersum(sequence, start=0): result = type(start)() for item in sequence: try: result += supersum(item, start) except: result += item return result It's probably more robust to do: def supersum(sequence, start=0): for item in sequence: try: result = result + supersum(item, start) except: result = result + item return result I assume you meant to put "result = start" in there at the beginning. as that way you aren't assuming the signature of type(start). It's not quite clear to me what the OP's intentions are in the general case, but calling supersum(item, start) seems odd - for example, is the following desirable? >>> supersum([[1], [2], [3]], 4) 22 I would have thought that the "correct" answer would be 10. How about the following? def supersum(sequence, start = 0): result = start for item in reversed(sequence): try: result = supersum(item, result) except: result = item + result return result -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple recursive sum function | what's the cause of the weird behaviour?
On 7/6/2013 8:37 AM, Russel Walker wrote: I know this is simple but I've been starring at it for half an hour and trying all sorts of things in the interpreter but I just can't see where it's wrong. def supersum(sequence, start=0): result = start for item in sequence: try: result += supersum(item, start) except: Bare except statements cover up too many sins. I and others *strongly* recommend that you only catch what you *know* you actually want to (see below). result += item return result I recommend that you start with at least one test case, and with an edge case at that. If you cannot bring yourself to do it before writing a draft of the function code, do it immediately after and run. If you do not want to use a framework, use assert. assert supersum([]) == 0 assert supersum([], []) == [] Do the asserts match your intention? The tests amount to a specification by example. Any 'kind' of input that is not tested is not guaranteed to work. Back to the except clause: only add try..except xxx when needed to pass a test. -- Terry Jan Reedy -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple recursive sum function | what's the cause of the weird behaviour?
On 6 July 2013 13:59, Russel Walker wrote: > Since I've already wasted a thread I might as well... > > Does this serve as an acceptable solution? > > def supersum(sequence, start=0): > result = type(start)() > for item in sequence: > try: > result += supersum(item, start) > except: > result += item > return result It's probably more robust to do: def supersum(sequence, start=0): for item in sequence: try: result = result + supersum(item, start) except: result = result + item return result as that way you aren't assuming the signature of type(start). -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple recursive sum function | what's the cause of the weird behaviour?
On Sat, Jul 6, 2013 at 10:37 PM, Russel Walker wrote: > This works: > - - - - - - x = [[1], [2], [3]] supersum(x) > 6 supersum(x, []) > [1, 2, 3] > > > This does not: > - - - - - - - x = [[[1], [2]], [3]] supersum(x, []) > [1, 2, 1, 2, 3] You have a problem of specification here. What should supersum do with the list [1]? Should it recurse into it, or append it as a list? It can't do both. For a list flattener, you would need to either use .append for each element you come across, or .extend with each list, with some kind of check to find whether you should recurse or not. Still, it's a fun thing to play with. I like code golfing these sorts of trinketty functions, just for fun :) ChrisA -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple recursive sum function | what's the cause of the weird behaviour?
Russel Walker wrote: > Since I've already wasted a thread I might as well... > > Does this serve as an acceptable solution? > > def supersum(sequence, start=0): > result = type(start)() > for item in sequence: > try: > result += supersum(item, start) > except: > result += item > return result That depends on what is an acceptable result ;) For instance: >>> supersum([2, 3], 1) 5 >>> supersum([[1], ["abc"]], []) [1, 'a', 'b', 'c'] -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple recursive sum function | what's the cause of the weird behaviour?
Since I've already wasted a thread I might as well... Does this serve as an acceptable solution? def supersum(sequence, start=0): result = type(start)() for item in sequence: try: result += supersum(item, start) except: result += item return result -- http://mail.python.org/mailman/listinfo/python-list
Re: Simple recursive sum function | what's the cause of the weird behaviour?
Nevermind! Stupid of me to forget that lists or mutable so result and start both point to the same list. -- http://mail.python.org/mailman/listinfo/python-list
Simple recursive sum function | what's the cause of the weird behaviour?
I know this is simple but I've been starring at it for half an hour and trying all sorts of things in the interpreter but I just can't see where it's wrong. def supersum(sequence, start=0): result = start for item in sequence: try: result += supersum(item, start) except: result += item return result It's supposed to work like the builtin sum, but on multidimensional lists and also with the optional start parameter accepting something like an empty list and so would also works as a robust list flattener. It's just for kicks, I'm not actually going to use it for anything. This works: - - - - - - >>> x = [[1], [2], [3]] >>> supersum(x) 6 >>> supersum(x, []) [1, 2, 3] >>> This does not: - - - - - - - >>> x = [[[1], [2]], [3]] >>> supersum(x, []) [1, 2, 1, 2, 3] >>> -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
On Saturday, 6 October 2012 02:09:56 UTC+5:30, Dave Angel wrote: > On 10/05/2012 04:09 PM, Mike wrote: > > > Terry, > > > > > > I am not using the mail client. I am just posting on the site. > > > > And which site would that be (that you're using)? There are a few. I'm > > guessing you use google-groups. And all of them get gatewayed to the > > actual list, with differing numbers of bugs. > > > > I use email to access it directly. I solve one of the duplicate-message > > problems with google groups by automatically deleting any message > > addressed to google-groups. There are about 100 such messages each month. > > > > Another problem is that lots of these gateways post to both the > > newsgroup and to the python-list. > I found out earlier that this was why my posts was being double-posted in Google Groups. > > > > > > > Something wrong with this site. When you do individual reply, it does the > > double posting which it shouldn't. See "Ramachandra Apte's" reply. It is > > posted twice too. > > > > > > Thanks > > > > > > > > > > > > > > > -- > > > > DaveA -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
That worked, Ian. Thanks -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
On 10/05/2012 04:09 PM, Mike wrote: > Terry, > > I am not using the mail client. I am just posting on the site. And which site would that be (that you're using)? There are a few. I'm guessing you use google-groups. And all of them get gatewayed to the actual list, with differing numbers of bugs. I use email to access it directly. I solve one of the duplicate-message problems with google groups by automatically deleting any message addressed to google-groups. There are about 100 such messages each month. Another problem is that lots of these gateways post to both the newsgroup and to the python-list. > > Something wrong with this site. When you do individual reply, it does the > double posting which it shouldn't. See "Ramachandra Apte's" reply. It is > posted twice too. > > Thanks > > > -- DaveA -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
On Fri, Oct 5, 2012 at 2:03 PM, Mike wrote: > I added the print command. > > It prints [] when there is no data. Change "iter(next_r, None)" to "iter(next_r, [])" -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
Terry, I am not using the mail client. I am just posting on the site. Something wrong with this site. When you do individual reply, it does the double posting which it shouldn't. See "Ramachandra Apte's" reply. It is posted twice too. Thanks -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
I added the print command. It prints [] when there is no data. Thanks -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
On Fri, Oct 5, 2012 at 7:39 AM, Mike wrote: > Sorry about that. Here you go > > Traceback (most recent call last): > File "test.py", line 17, in > total = sum(float(col.value) for r in iter(next_r, None) for col in > r[0].columns.itervalues()) > File "test.py", line 17, in > total = sum(float(col.value) for r in iter(next_r, None) for col in > r[0].columns.itervalues()) > IndexError: list index out of range Maybe the sentinel value is not None as I assumed, and it's overrunning the end of the data? What does client.scannerGet return when there is no more data? -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
On 10/5/2012 9:47 AM, Mike wrote: On Friday, October 5, 2012 9:41:44 AM UTC-4, Ramchandra Apte wrote: On Friday, 5 October 2012 19:09:15 UTC+5:30, Mike wrote: On Thursday, October 4, 2012 4:52:50 PM UTC-4, Mike wrote: Hi All, I am new to python and am getting the data from hbase. If you want as many people as possible to read your posts, stop using a mail-agent and site that spits in the face of readers by doubling blank lines each iteration. Alternatives have been discussed previously. -- Terry Jan Reedy -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
On Friday, October 5, 2012 9:41:44 AM UTC-4, Ramchandra Apte wrote: > On Friday, 5 October 2012 19:09:15 UTC+5:30, Mike wrote: > > > On Thursday, October 4, 2012 4:52:50 PM UTC-4, Mike wrote: > > > > > > > Hi All, > > > > > > > > > > > > > > > > > > > > > > > > > > > > I am new to python and am getting the data from hbase. > > > > > > > > > > > > > > I am trying to do sum on the column as below > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > scanner = client.scannerOpenWithStop("tab", "10", "1000", ["cf:col1"]) > > > > > > > > > > > > > > total = 0.0 > > > > > > > > > > > > > > r = client.scannerGet(scanner) > > > > > > > > > > > > > > while r: > > > > > > > > > > > > > > for k in (r[0].columns): > > > > > > > > > > > > > > total += float(r[0].columns[k].value) > > > > > > > > > > > > > > r = client.scannerGet(scanner) > > > > > > > > > > > > > > > > > > > > > > > > > > > > print total > > > > > > > > > > > > > > > > > > > > > > > > > > > > Do you know of better (faster) way to do sum? > > > > > > > > > > > > > > > > > > > > > > > > > > > > Any thoughts please? > > > > > > > > > > > > > > > > > > > > > > > > > > > > Thanks > > > > > > > > > > > > Sorry about that. Here you go > > > > > > > > > > > > Traceback (most recent call last): > > > > > > File "test.py", line 17, in > > > > > > total = sum(float(col.value) for r in iter(next_r, None) for col in > > r[0].columns.itervalues()) > > > > > > File "test.py", line 17, in > > > > > > total = sum(float(col.value) for r in iter(next_r, None) for col in > > r[0].columns.itervalues()) > > > > > > IndexError: list index out of range > > > > the variable "r" is an empty list Here is the actual code. scanner = client.scannerOpenWithStop("tab", "10", "1000", ["cf:col1"]) next_r = functools.partial(client.scannerGet, scanner) total = sum(float(col.value) for r in iter(next_r, None) for col in r[0].columns.itervalues()) Scanner does have rows. Are we missing something please? Thanks -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
On Friday, 5 October 2012 19:09:15 UTC+5:30, Mike wrote: > On Thursday, October 4, 2012 4:52:50 PM UTC-4, Mike wrote: > > > Hi All, > > > > > > > > > > > > I am new to python and am getting the data from hbase. > > > > > > I am trying to do sum on the column as below > > > > > > > > > > > > > > > > > > scanner = client.scannerOpenWithStop("tab", "10", "1000", ["cf:col1"]) > > > > > > total = 0.0 > > > > > > r = client.scannerGet(scanner) > > > > > > while r: > > > > > > for k in (r[0].columns): > > > > > > total += float(r[0].columns[k].value) > > > > > > r = client.scannerGet(scanner) > > > > > > > > > > > > print total > > > > > > > > > > > > Do you know of better (faster) way to do sum? > > > > > > > > > > > > Any thoughts please? > > > > > > > > > > > > Thanks > > > > Sorry about that. Here you go > > > > Traceback (most recent call last): > > File "test.py", line 17, in > > total = sum(float(col.value) for r in iter(next_r, None) for col in > r[0].columns.itervalues()) > > File "test.py", line 17, in > > total = sum(float(col.value) for r in iter(next_r, None) for col in > r[0].columns.itervalues()) > > IndexError: list index out of range the variable "r" is an empty list -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
On Thursday, October 4, 2012 4:52:50 PM UTC-4, Mike wrote: > Hi All, > > > > I am new to python and am getting the data from hbase. > > I am trying to do sum on the column as below > > > > > > scanner = client.scannerOpenWithStop("tab", "10", "1000", ["cf:col1"]) > > total = 0.0 > > r = client.scannerGet(scanner) > > while r: > > for k in (r[0].columns): > > total += float(r[0].columns[k].value) > > r = client.scannerGet(scanner) > > > > print total > > > > Do you know of better (faster) way to do sum? > > > > Any thoughts please? > > > > Thanks Sorry about that. Here you go Traceback (most recent call last): File "test.py", line 17, in total = sum(float(col.value) for r in iter(next_r, None) for col in r[0].columns.itervalues()) File "test.py", line 17, in total = sum(float(col.value) for r in iter(next_r, None) for col in r[0].columns.itervalues()) IndexError: list index out of range -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
On Friday, 5 October 2012 07:31:24 UTC+5:30, Mike wrote: > I agree with you, Ian. Thanks for all the help. Now I get the below error. > > > > File "test.py", line 17, in > > total = sum(float(col.value) for r in iter(next_r, None) for col in > r[0].columns.itervalues()) > > File "test.py", line 17, in > > total = sum(float(col.value) for r in iter(next_r, None) for col in > r[0].columns.itervalues()) > > > > Thanks You have missed the last line of the traceback (error) -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
I agree with you, Ian. Thanks for all the help. Now I get the below error. File "test.py", line 17, in total = sum(float(col.value) for r in iter(next_r, None) for col in r[0].columns.itervalues()) File "test.py", line 17, in total = sum(float(col.value) for r in iter(next_r, None) for col in r[0].columns.itervalues()) Thanks -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
On Thu, Oct 4, 2012 at 6:40 PM, Mike wrote: > Traceback (most recent call last): > File "test.py", line 16, in > total = sum(float(col.value) for r in iter(next_r, None) for col in > r.itervalues()) > File "test.py", line 16, in > total = sum(float(col.value) for r in iter(next_r, None) for col in > r.itervalues()) > AttributeError: 'list' object has no attribute 'itervalues' "r.itervalues()" should have been "r[0].columns.itervalues()", I think. It's hard to test code against an API that you don't have. :-) -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
On Thursday, October 4, 2012 5:40:26 PM UTC-4, Dave Angel wrote: > On 10/04/2012 05:29 PM, Mike wrote: > > > I get below error > > > > > > NameError: name 'functools' is not defined > > > > > > > functools is a module in the standard library. You need to import it. > > > > import functools > > > > > > > > -- > > > > DaveA I imported functools. Now I get the below error please. Traceback (most recent call last): File "test.py", line 16, in total = sum(float(col.value) for r in iter(next_r, None) for col in r.itervalues()) File "test.py", line 16, in total = sum(float(col.value) for r in iter(next_r, None) for col in r.itervalues()) AttributeError: 'list' object has no attribute 'itervalues' Thanks -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
On Fri, Oct 5, 2012 at 7:29 AM, Mike wrote: > I get below error > > NameError: name 'functools' is not defined > > Thanks functools is a module: import functools ChrisA -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
On 10/04/2012 05:29 PM, Mike wrote: > I get below error > > NameError: name 'functools' is not defined > functools is a module in the standard library. You need to import it. import functools -- DaveA -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
Thanks Ian for the quick reply. I get the below error. NameError: name 'itertools' is not defined Thanks -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
I get below error NameError: name 'functools' is not defined Thanks -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
On Thu, Oct 4, 2012 at 3:04 PM, Ian Kelly wrote: > scanner = client.scannerOpenWithStop("tab", "10", "1000", ["cf:col1"]) > next_r = itertools.partial(client.scannerGet, scanner) > total = sum(float(col.value) for r in iter(next_r, None) for col in > r.itervalues()) That should be "functools" above, not "itertools". :-P -- http://mail.python.org/mailman/listinfo/python-list
Re: sum function
On Thu, Oct 4, 2012 at 2:52 PM, wrote: > scanner = client.scannerOpenWithStop("tab", "10", "1000", ["cf:col1"]) > total = 0.0 > r = client.scannerGet(scanner) > while r: > for k in (r[0].columns): > total += float(r[0].columns[k].value) > r = client.scannerGet(scanner) > > print total > > Do you know of better (faster) way to do sum? scanner = client.scannerOpenWithStop("tab", "10", "1000", ["cf:col1"]) next_r = itertools.partial(client.scannerGet, scanner) total = sum(float(col.value) for r in iter(next_r, None) for col in r.itervalues()) -- http://mail.python.org/mailman/listinfo/python-list
sum function
Hi All, I am new to python and am getting the data from hbase. I am trying to do sum on the column as below scanner = client.scannerOpenWithStop("tab", "10", "1000", ["cf:col1"]) total = 0.0 r = client.scannerGet(scanner) while r: for k in (r[0].columns): total += float(r[0].columns[k].value) r = client.scannerGet(scanner) print total Do you know of better (faster) way to do sum? Any thoughts please? Thanks -- http://mail.python.org/mailman/listinfo/python-list