Lista de números sin repeticiones y ordenada.

Este código devuelve una lista [0,0,0] a [9,9,9], que no produce repeticiones y cada elemento está en orden de menor a mayor.

def number_list(): b=[] for position1 in range(10): for position2 in range(10): for position3 in range(10): if position1<=position2 and position2<=position3: b.append([position1, position2, position3]) return b 

Buscando una forma mejor y más corta de escribir este código sin usar múltiples variables (posición1, posición2, posición3), en lugar de eso solo usa una variable i .

Aquí está mi bash de modificar el código, pero estoy atascado en la implementación de las sentencias if :

 def number_list(): b=[] for i in range(1000): b.append(map(int, str(i).zfill(3))) return b 

Related of "Lista de números sin repeticiones y ordenada."

En la misma nota que los otros itertools responden, hay otra forma con combinations_with_replacement :

 list(itertools.combinations_with_replacement(range(10), 3)) 

Simplemente use la comprensión de la lista, una forma de hacerlo:

  >>> [[x,y,z] for x in range(10) for y in range(10) for z in range(10) if x<=y and y<=z] [[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 0, 3], [0, 0, 4], [0, 0, 5], [0, 0, 6], [0, 0, 7], [0, 0, 8], [0, 0, 9], [0, 1, 1], [0, 1, 2], [0, 1, 3], [0, 1, 4], [0, 1, 5], [0, 1, 6], [0, 1, 7], [0, 1, 8], [0, 1, 9], [0, 2, 2], [0, 2, 3], [0, 2, 4], [0, 2, 5], [0, 2, 6], [0, 2, 7], [0, 2, 8], [0, 2, 9], [0, 3, 3], [0, 3, 4], [0, 3, 5], [0, 3, 6], [0, 3, 7], [0, 3, 8],....[6, 8, 8], [6, 8, 9], [6, 9, 9], [7, 7, 7], [7, 7, 8], [7, 7, 9], [7, 8, 8], [7, 8, 9], [7, 9, 9], [8, 8, 8], [8, 8, 9], [8, 9, 9], [9, 9, 9]] 

Aquí hay una forma más sencilla que hacer las comprobaciones, pero que aún es IMO peor que combinations_with_replacement :

 [(a, b, c) for a in range(10) for b in range(a, 10) for c in range(b, 10)] 

Es decir, en lugar de filtrar valores después de la producción, en primer lugar solo produce los valores que desea.

Puede usar itertools.product() para eliminar los bucles nesteds:

 >>> filter(lambda i: i[0] <= i[1] <= i[2], ... itertools.product(range(10), range(10), range(10))) 

O mejor con listas de comprensión:

 >>> numbers = itertools.product(range(10), range(10), range(10)) >>> [(a, b, c) for a, b, c in numbers if a <= b <= c] 

Creo que vale la pena señalar que el código original es extraño y se puede reescribir fácilmente para que sea más simple:

 def number_list2(): b=[] for position1 in range(10): for position2 in range(position1, 10): for position3 in range(position2, 10): if position1<=position2 and position2<=position3: b.append([position1, position2, position3]) return b 

Hay mejores soluciones aquí, pero esta es la piedra angular para llegar a ellas.

Este código se puede hacer fácilmente con la recursividad, sin usar itertools .

  1. n – siendo la longitud de la tupla
  2. m – siendo el límite superior de cada valor

El código:

 def non_decreasing(n, m): if n==0: return [] if n==1: return [[i] for i in range(1,m+1)] return [[i] + t for t in non_decreasing(n-1, m) for i in range(1,t[0]+1)] 

El resultado es la salida de non_decreasing(3,9)