2016-06-13 5 views
3

は、私は次のようにリストの内包を使用してリストを作成したいと:。Python:以前の値に基づいたリストの理解?

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] 

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

@Finwood、もしそれがうまくいくなら、OPが望んでいることはまったくあります。 –

+0

さて、それを大まかな見積もりと呼んでみましょう。しかし、私はアプローチが好きです:-) – Finwood

関連する問題