Help me write better Code
Rustom Mody
rustompmody at gmail.com
Thu Jul 10 14:38:09 EDT 2014
On Wednesday, July 9, 2014 9:14:01 PM UTC+5:30, Mark Lawrence wrote:
> On 09/07/2014 15:27, sssdevelop wrote:
> > Hello,
> > I have working code - but looking for better/improved code. Better coding practices, better algorithm :)
> > Problem: Given sequence of increasing integers, print blocks of consecutive integers.
> > Example:
> > Input: [10, 11, 12, 15]
> > Output: [10, 11, 12]
> > Input: [51, 53, 55, 67, 68, 91, 92, 93, 94, 99]
> > Outout: [67, 68], [91, 92, 93, 94]
> > My code looks as below:
> > -----------------------------
> > #!/usr/bin/python
> > a = [51, 53, 55, 67, 68, 91, 92, 93, 94, 99]
> > #a = []
> > #a = [10]
> > #a = [10, 11, 12, 15]
> > print "Input: "
> > print a
> > prev = 0
> > blocks = []
> > tmp = []
> > last = 0
> > for element in a:
> > if prev == 0:
> > prev = element
> > next
> > if element == prev + 1:
> > if tmp:
> > pass
> > else:
> > tmp.append(prev)
> > tmp.append(element)
> > else:
> > if tmp:
> > blocks.append(tmp)
> > tmp = []
> > prev = element
> > if tmp:
> > blocks.append(tmp)
> > if blocks:
> > #print "I have repeated elements and those are:"
> > for b in blocks:
> > print b
> > -----------------------
> > thank you in advance!
> Adopted from here https://docs.python.org/3.0/library/itertools.html
> data = [51, 53, 55, 67, 68, 91, 92, 93, 94, 99]
> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]):
> group = list(map(operator.itemgetter(1), g))
> if len(group) > 1:
> print(group)
> [67, 68]
> [91, 92, 93, 94]
> --
Mark's version without the print.
Which says in a different way, Terry's point-2 :
> 2. Separate interface code that gets input and presents output from the
> function that processes the increasing sequence. The function should not
> care whether the ints come from a user, file, or calculation.
$ python3
Python 3.4.1 (default, Jun 9 2014, 10:28:44)
[GCC 4.8.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from operator import itemgetter
>>> from itertools import groupby
>>> data = [51, 53, 55, 67, 68, 91, 92, 93, 94, 99]
>>> [group for k,g in groupby(enumerate(data), lambda t:t[0]-t[1])
... for group in [list(map(itemgetter(1), g))]
... if len(group) > 1
...
... ]
[[67, 68], [91, 92, 93, 94]]
>>>
You can replace the outermost '[]' with '()'
More information about the Python-list
mailing list