web-dev-qa-db-fra.com

Générez une séquence de nombres dans Python

Comment puis-je générer la séquence de nombres "1,2,5,6,9,10 ......" et ainsi jusqu'à 100 en Python? J'ai même besoin de la virgule (',') incluse, mais ce n'est pas le problème principal.

La séquence: chaque nombre à partir de 1..100, divisible par 4 avec le reste 1 ou 2.

38
user1460818

Chaque nombre de 1,2,5,6,9,10 ... est divisible par 4 avec le reste 1 ou 2.

>>> ','.join(str(i) for i in xrange(100) if i % 4 in (1,2))
'1,2,5,6,9,10,13,14,...'
38
>>> ','.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'

C'était une solution rapide et assez sale.

Maintenant, pour une solution adaptée à différents types de problèmes de progression:

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)))

Et voici des idées similaires mises en œuvre en utilisant 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)))
17
Oleh Prypin

Inclut quelques devinettes sur la séquence exacte que vous attendez:

>>> 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'

En une ligne:

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

(d'ailleurs, c'est Python 3 compatible))

11
poke

en utilisant numpy et la compréhension de la liste, vous pouvez faire la

import numpy as np
[num for num in np.arange(1,101) if (num%4 == 1 or num%4 == 2)]
2
sushmit

Cela fonctionne en exploitant les propriétés% de la liste plutôt que les incréments.

for num in range(1,100):
    if num % 4 == 1 or num % 4 ==2:
        n.append(num)
        continue
    pass
1
FieryBanditry

En supposant que j'ai bien deviné le motif (en alternant les incréments de 1 et 3), ceci devrait produire le résultat souhaité:

def sequence():
    res = []
    diff = 1
    x = 1
    while x <= 100:
        res.append(x)
        x += diff
        diff = 3 if diff == 1 else 1
    return ', '.join(res)
0
Xion

En supposant que votre séquence alterne des incréments compris entre 1 et 3

numbers = [1]
while numbers[-1] < 100:
    numbers.append(numbers[-1] + 1)
    numbers.append(numbers[-1] + 3)

print ', '.join(map(str, numbers))

Cela pourrait être plus facile à modifier si votre séquence est différente mais je pense que poke ou BlaXpirit sont des réponses plus agréables que les miennes.

0
Facundo Casco