数字列表没有重复和有序

时间:2015-12-03 05:05:02

标签: python

此代码返回一个列表[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

6 个答案:

答案 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,即可通过递归轻松完成此代码。

  1. n-是元组的长度
  2. 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)

的输出