2016-06-13 2 views
3

는 내가 좋아하는 지능형리스트를 사용하여 목록 을 만들려는 말 :.파이썬 : 이전 값을 기반으로하는 목록 이해력?

l = [100., 50., 25., 12.5, ..., a_n] 

... 즉, 어떤 숫자로 시작하고 같은 목록에 그에서 N "반쪽"를 생성합니다. 나는 그것을하기위한 단순한 비단뱀의 길을 놓치고 있거나 단순히 좋은 for-loop에 의지해야 할 것이다. 이 작업을 수행 할 수 있습니까? 감사.

+0

발전기의 좋은 유스 케이스. –

답변

4

를?

start = 2500.0 
n = 50 
halves = [start/2.0**i for i in range(n)] 

이 동일 :

[start * 2.0**(-i) for i in range(n)] 

아마 덜 효율적 @ DeepSpace의 대답과 달리하지만, 한 줄에 나는 이것에 대한 목록 빌려 사용하는 것이 가능하다 생각하지만 것 같다

+2

나는 OP가'n' 길이 목록을 생성하고 싶다고 생각한다. –

+2

좋습니다, 길이 변수를 추가했습니다. – DomTomCat

4

발전기를 정의하고 지능형리스트에서 사용 :

def halve(n): 
    while n >= 1: 
     yield n 
     n /= 2 

print([_ for _ in halve(100)]) 
>> [100, 50.0, 25.0, 12.5, 6.25, 3.125, 1.5625] 

또는 단순히 목록으로 변환 : 경우

print(list(halve(100))) 
>> [100, 50.0, 25.0, 12.5, 6.25, 3.125, 1.5625] 

편집 @R 나르의 의견은 정확 :

def halve(start, n): 
    for _ in range(n): 
     yield start 
     start /= 2 

print(list(halve(100, 3))) 
>> [100, 50.0, 25.0] 

print(list(halve(100, 4))) 
>> [100, 50.0, 25.0, 12.5] 
+0

OP는 'n'개의 반수를 의미하므로 'n = 100'인 경우 100 개의 숫자 목록을 반환해야한다고 생각합니다. –

0

다음 코드는 float가 아닌 int와 호환됩니다.

[100>>i for i in range(10)] 

이 반환 :이 방법에 대해

[100, 50, 25, 12, 6, 3, 1, 0, 0, 0] 
+1

이것은 약간의 비트 레벨 해킹입니다. – Finwood

+0

@ 핀 우드, 그것이 효과가 있다면 그것은 OP가 원하는 모든 것을 할 것입니다. –

+0

글쎄, 대략적인 평가라고 부르 자. 그러나 나는 접근 방식을 좋아한다 :-) – Finwood

관련 문제