Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Generate a sequence of numbers in Python

How can I generate the sequence of numbers "1,2,5,6,9,10......" and so until 100 in Python? I even need the comma (',') included, but this is not the main problem.

The sequence: every number from 1..100, divisible by 4 with remainder 1 or 2.

like image 780
user1460818 Avatar asked Jun 16 '12 15:06

user1460818


People also ask

Is a list a sequence in Python?

The main sequence types in Python are lists, tuples and range objects.


5 Answers

Every number from 1,2,5,6,9,10... is divisible by 4 with remainder 1 or 2.

>>> ','.join(str(i) for i in xrange(100) if i % 4 in (1,2))
'1,2,5,6,9,10,13,14,...'
like image 191
Aleksei astynax Pirogov Avatar answered Sep 29 '22 21:09

Aleksei astynax Pirogov


>>> ','.join('{},{}'.format(i, i + 1) for i in range(1, 100, 4))
'1,2,5,6,9,10,13,14,17,18,21,22,25,26,29,30,33,34,37,38,41,42,45,46,49,50,53,54,57,58,61,62,65,66,69,70,73,74,77,78,81,82,85,86,89,90,93,94,97,98'

That was a quick and quite dirty solution.

Now, for a solution that is suitable for different kinds of progression problems:

def deltas():
    while True:
        yield 1
        yield 3
def numbers(start, deltas, max):
    i = start
    while i <= max:
        yield i
        i += next(deltas)
print(','.join(str(i) for i in numbers(1, deltas(), 100)))

And here are similar ideas implemented using itertools:

from itertools import cycle, takewhile, accumulate, chain

def numbers(start, deltas, max):
    deltas = cycle(deltas)
    numbers = accumulate(chain([start], deltas))
    return takewhile(lambda x: x <= max, numbers)

print(','.join(str(x) for x in numbers(1, [1, 3], 100)))
like image 43
Oleh Prypin Avatar answered Sep 29 '22 22:09

Oleh Prypin


Includes some guessing on the exact sequence you are expecting:

>>> l = list(range(1, 100, 4)) + list(range(2, 100, 4))
>>> l.sort()
>>> ','.join(map(str, l))
'1,2,5,6,9,10,13,14,17,18,21,22,25,26,29,30,33,34,37,38,41,42,45,46,49,50,53,54,57,58,61,62,65,66,69,70,73,74,77,78,81,82,85,86,89,90,93,94,97,98'

As one-liner:

>>> ','.join(map(str, sorted(list(range(1, 100, 4))) + list(range(2, 100, 4))))

(btw. this is Python 3 compatible)

like image 41
poke Avatar answered Sep 29 '22 22:09

poke


This works by exploiting the % properties of the list rather than the increments.

for num in range(1,100):
    if num % 4 == 1 or num % 4 ==2:
        n.append(num)
        continue
    pass
like image 31
FieryBanditry Avatar answered Sep 29 '22 21:09

FieryBanditry


using numpy and list comprehension you can do the

import numpy as np
[num for num in np.arange(1,101) if (num%4 == 1 or num%4 == 2)]
like image 41
sushmit Avatar answered Sep 29 '22 22:09

sushmit