Comment puis-je créer une liste de nombres consécutifs où chaque nombre se répète N fois, par exemple:

list = [0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,5,5,5]
3
wmatt 8 août 2016 à 23:40

4 réponses

Meilleure réponse

Une autre idée, sans avoir besoin d'autres packages ou sommes:

[x//N for x in range((M+1)*N)]

N est votre nombre de répétitions et M est la valeur maximale à répéter. Par exemple.

N = 3
M = 5
[x//N for x in range((M+1)*N)]

Les rendements

[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5]
4
wilkesybear 8 août 2016 à 20:51

Mon premier réflexe est d'obtenir une aide fonctionnelle du package funcy. Si N est le nombre de fois pour répéter chaque valeur et M est la valeur maximale à répéter, alors vous pouvez faire

import funcy as fp

fp.flatten(fp.repeat(i, N) for i in range(M + 1))

Cela retournera un générateur, donc pour obtenir le tableau, vous pouvez simplement appeler list() autour de lui

2
wilkesybear 8 août 2016 à 20:46

Le morceau de code suivant est la version la plus simple à laquelle je puisse penser. C'est un peu sale et long, mais ça fait le travail.

À mon avis, c'est plus facile à comprendre.

def mklist(s, n):
    l = []  # An empty list that will contain the list of elements
            # and their duplicates.

    for i in range(s):     # We iterate from 0 to s
        for j in range(n): # and appending each element (i) to l n times.
            l.append(i)

    return l  # Finally we return the list.

Si vous exécutez le code…:

print mklist(10, 2)

[0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]

print mklist(5, 3)

[0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4

Une autre version un peu plus soignée, avec compréhension des listes. Mais euhmmm… Nous devons quand même le trier.

def mklist2(s, n):            
    return sorted([l  for l in range(s) * n])

L'exécution de cette version donnera les résultats suivants.

print mklist2(5, 3)

Brut: [0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4]

Trié: [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]

0
Remy J 9 août 2016 à 01:14

sum([[i]*n for i in range(0,x)], [])

0
mr nick 8 août 2016 à 20:47