如何创建一个创建列表的函数,将每次包含的数字数量增加到指定值?
例如,如果最大值为 4,则列表将包含
1, 2, 2, 3, 3, 3, 4, 4, 4, 4
很难解释我在寻找什么,但从这个例子中我想你会明白的!
谢谢
如何创建一个创建列表的函数,将每次包含的数字数量增加到指定值?
例如,如果最大值为 4,则列表将包含
1, 2, 2, 3, 3, 3, 4, 4, 4, 4
很难解释我在寻找什么,但从这个例子中我想你会明白的!
谢谢
我会使用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))
一个嵌套循环。这将是一种非常基本的方法。有很多更好的方法,这应该给你一个大致的想法。
>>> 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]
您可以使用递归函数:
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]
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
,这是规范的方式。
对问题的不同看法(不太复杂):
>>> 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]
如图所示,创建列表的一种相当直接的方法是通过
[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
>>>
>>> list(''.join([str(x) * x for x in range(1, 5)]))
我会用发电机:
>>> 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]