Список номеров без повторов и заказа

Этот код возвращает список [0,0,0] до [9,9,9], который не производит повторений, и каждый элемент находится в порядке от наименьшего к наибольшему.

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

Ищите более короткий и лучший способ написать этот код без использования нескольких переменных (position1, position2, position3), вместо этого используйте только одну переменную i.

Вот моя попытка изменить код, но я застрял в реализации операторов if:

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

Ответы

Ответ 1

В том же примечании, что и в ответе itertools, есть другой способ: combinations_with_replacement:

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

Ответ 2

Просто используйте понимание списка, один из способов сделать это:

 >>> [[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]]

Ответ 3

Здесь более простой способ, чем делать проверки, но который по-прежнему остается IMO хуже combinations_with_replacement:

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

А именно, вместо фильтрации значений после производства вы просто производите только те значения, которые вы хотите в первую очередь.

Ответ 4

Вы можете использовать itertools.product() для устранения вложенных циклов:

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

Или лучше со списком:

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

Ответ 5

Я думаю, что стоит отметить, что исходный код странный и может быть легко переписан, чтобы быть проще:

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

Здесь есть лучшие решения, но это один из шагов, чтобы добраться до них.