8

如何创建一个创建列表的函数,将每次包含的数字数量增加到指定值?

例如,如果最大值为 4,则列表将包含

1, 2, 2, 3, 3, 3, 4, 4, 4, 4

很难解释我在寻找什么,但从这个例子中我想你会明白的!

谢谢

4

8 回答 8

17

我会使用itertools.chain

itertools.chain(*([i] * i for i in range(1, 5)))

或者itertools.chain.from_iterable稍微懒一点:

itertools.chain.from_iterable([i] * i for i in range(1, 5))

对于终极懒惰,搭配itertools.repeat-- (xrange在你使用 python2.x 时使用):

import itertools as it
it.chain.from_iterable(it.repeat(i, i) for i in range(1, 5))

作为一个函数:

def lazy_funny_iter(n):
    return it.chain.from_iterable(it.repeat(i, i) for i in range(1, n+1))

def lazy_funny_list(n):
    return list(lazy_funny_iter(n))
于 2012-11-05T16:32:27.550 回答
16

一个嵌套循环。这将是一种非常基本的方法。有很多更好的方法,这应该给你一个大致的想法。

>>> def listmaker(num):
    l = []
    for i in xrange(1, num+1):
        for j in xrange(i):
            l.append(i)
    return l

>>> print listmaker(4)
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]

这是用列表理解来做的:

>>> def listmaker2(num):
    return [y for z in [[x]*(x) for x in xrange(1, num+1)] for y in z]

>>> print listmaker2(4)
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]

按照建议使用扩展。

>>> def listmaker3(num):
    l = []
    for i in xrange(1, num+1):
        l.extend([i]*(i))
    return l

>>> print listmaker3(4)
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
于 2012-11-05T16:27:10.807 回答
9

您可以使用递归函数:

def my_func(x):
    if x <= 0:
        return []
    else:
        return my_func(x-1) + [x] * x

>>> my_func(4)
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
于 2012-11-05T16:40:39.173 回答
7
In [1]: def funny_list(n):
   ...:     return sum(([i]*i for i in range(1, n+1)), [])
   ...: 

In [2]: funny_list(4)
Out[2]: [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]

但是,这不能变成真正的生成器,不像itertools.chain,这是规范的方式。

于 2012-11-05T16:27:52.240 回答
4

对问题的不同看法(不太复杂):

>>> a = range(1,5)
>>> for i in range(2,5):
...     a.extend(range(i,5))
... 
>>> print sorted(a) #Remove the sort if you don't need it
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
于 2012-11-05T16:49:11.823 回答
4

如图所示,创建列表的一种相当直接的方法是通过

[i for i in range(1,n+1) for j in range(i)]

其中n是列表中出现的最大数字。以上相当于之前几个建议的答案中使用的方法,但表达方式稍微干净一些。

到目前为止提到的所有方法的替代方法是注意i列表的第 th 元素大约等于 的平方根的整数部分2*i。稍作调整,这使得一个相当简单的生成器成为可能,如下所示。

def gen_nnlist(nmax):
    n = 1
    while n < nmax*(nmax+1):
        yield int(n**.5+.5)
        n += 2

以下是在 python 2.7.3 解释器中执行代码的一些示例输出:

>>> print [i for i in gen_nnlist(4)]
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
>>> print [i for i in gen_nnlist(6)]
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6]
>>> fun = gen_nnlist(3)
>>> for i in fun: print i
... 
1
2
2
3
3
3
>>>
于 2012-11-05T17:40:53.307 回答
3
>>> list(''.join([str(x) * x for x in range(1, 5)]))
于 2012-11-05T16:31:29.213 回答
2

我会用发电机:

>>> def growingSeq(maxN):
...     for n in range(1,maxN+1):
...         for _ in range(n):
...             yield n
... 
>>> growingSeq(4)
<generator object growingSeq at 0x1004db280>
>>> list(growingSeq(4))
[1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
于 2012-11-05T19:00:06.220 回答