Ответ 1
В том же примечании, что и в ответе itertools
, есть другой способ: combinations_with_replacement
:
list(itertools.combinations_with_replacement(range(10), 3))
Этот код возвращает список [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
В том же примечании, что и в ответе itertools
, есть другой способ: combinations_with_replacement
:
list(itertools.combinations_with_replacement(range(10), 3))
Просто используйте понимание списка, один из способов сделать это:
>>> [[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]]
Здесь более простой способ, чем делать проверки, но который по-прежнему остается IMO хуже combinations_with_replacement
:
[(a, b, c) for a in range(10)
for b in range(a, 10)
for c in range(b, 10)]
А именно, вместо фильтрации значений после производства вы просто производите только те значения, которые вы хотите в первую очередь.
Вы можете использовать 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]
Я думаю, что стоит отметить, что исходный код странный и может быть легко переписан, чтобы быть проще:
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
Здесь есть лучшие решения, но это один из шагов, чтобы добраться до них.