此代码返回一个列表[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
答案 0 :(得分:12)
在与其他itertools
答案相同的说明中,combinations_with_replacement
还有另一种方法:
list(itertools.combinations_with_replacement(range(10), 3))
答案 1 :(得分:7)
只需使用列表理解,一种方法:
>>> [[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]]
答案 2 :(得分:5)
这比检查更简单,但IMO仍比combinations_with_replacement
更糟糕:
[(a, b, c) for a in range(10)
for b in range(a, 10)
for c in range(b, 10)]
即,不是在生产后过滤值,而是仅在第一时间生成所需的值。
答案 3 :(得分:3)
您可以使用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]
答案 4 :(得分:0)
我认为值得指出的是,原始代码很奇怪,可以轻松地重写,以便更简单:
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
这里有更好的解决方案,但这是解决问题的基石。
答案 5 :(得分:0)
无需使用itertools
,即可通过递归轻松完成此代码。
n
-是元组的长度m
-是每个值的上限代码:
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)]
结果是non_decreasing(3,9)