2009-09-27 93 views
1

我需要一个很好的函数来做到这一点在python中。python中列表的列表?

def foo(n): 
    # do somthing 
    return list_of_lists 

>> foo(6) 
    [[1], 
    [2,3], 
    [4,5,6]] 
>> foot(10) 
    [[1], 
    [2,3], 
    [4,5,6] 
    [7,8,9,10]] 

回答

9
def foo(n): 
    lol = [ [] ] 
    i = 1 
    for x in range(n): 
    if len(lol[-1]) >= i: 
     i += 1 
     lol.append([]) 
    lol[-1].append(x) 
    return lol 
8
def foo(n): 
    i = 1 
    while i <= n: 
     last = int(i * 1.5 + 1) 
     yield range(i, last) 
     i = last 

list(foo(3)) 

你希望当你使用一个号码n不起作用,像9什么行为?

1

还有一个,只是为了好玩:

def lol(n): 
    entries = range(1,n+1) 
    i, out = 1, [] 
    while len(entries) > i: 
     out.append([entries.pop(0) for x in xrange(i)]) 
     i += 1 
    return out + [entries] 

(这不依赖具有数1..N基础列表上)从高盛的答案,但没有神秘的“1.5改编

+0

什么LS和它在哪儿声明 – Edwards 2009-09-27 08:24:33

5

”。

def foo(n): 
    i = c = 1 
    while i <= n: 
     yield range(i, i + c) 
     i += c 
     c += 1 

list(foo(10)) 
3

这可能不是一个列表解析合适的情况,但我不在乎!

from math import ceil, sqrt, max 

def tri(n): 
    return n*(n+1) // 2 

def irt(x): 
    return int(ceil((-1 + sqrt(1 + 8*x))/2)) 

def foo(n): 
    return [list(range(tri(i)+1, min(tri(i+1)+1, n+1))) for i in range(irt(n))] 
+1

+ 1,为最糟糕的解决方案(仍然喜欢它虽然...) – 2009-09-27 09:05:23

+0

Num。 ∞,就是我。 – outis 2009-09-27 12:58:19

1

这里是我的Python高尔夫入门:

>>> def foo(n): 
...  def lower(i): return 1 + (i*(i-1)) // 2 
...  def upper(i): return i + lower(i) 
...  import math 
...  x = (math.sqrt(1 + 8*n) - 1) // 2 
...  return [list(range(lower(i), upper(i))) for i in range(1, x+1)] 
... 
>>> 
>>> for i in [1,3,6,10,15]: 
...  print i, foo(i) 
... 
1 [[1]] 
3 [[1], [2, 3]] 
6 [[1], [2, 3], [4, 5, 6]] 
10 [[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]] 
15 [[1], [2, 3], [4, 5, 6], [7, 8, 9, 10], [11, 12, 13, 14, 15]] 
>>> 

x的计算依赖于正根二次方程的解法

0 = y*y + y - 2*n