2009-09-27 97 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