2009-09-27 6 views
1

파이썬에서이 작업을 수행하려면 좋은 함수가 필요합니다.파이썬 목록 목록?

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)) 

는 9처럼 작동하지 않습니다 n의 번호를 사용할 때 어떤 행동을 기대합니까? 단지 재미를 위해

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] 

GS의 대답에서하지만 1.5 "신비없이 적응

+0

뭐죠 LS하고 – Edwards

5

(이 숫자의 1..N을 갖는 기본 목록에 의존하지 않는다) ".

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, 최악의 해결책 (여전히 그래도 좋아 ...) –

+0

Num. ∞, 나야. – outis

1

가 여기 내 파이썬 골프 항목입니다 :

>>> 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