2017-05-18 8 views
0

私はこれが不思議な質問ですが、ここではpython初心者です。私は下に来てそれは動作しますが、これを行うためのより効率的な方法があるかどうか疑問に思っていました:リストを作成して追加するもっとエレガントな方法はありますか?

ここでの目標は4/- 4/11 .... n回

n = 5000 
x = 1.0 
list_1 = [] #make a list for denominator 
list_2 = [] #make a list of fractions using list_1 as denominator 
list_3 = [] #make a list change odd elements to negative 

for i in range(n): 
    list_1.append(float(x)) 
    x = x + 2 
for i in range(len(list_1)): 
    list_2.append(4/list_1[i]) 
for count, i in enumerate(list_2): 
    if count % 2 == 0: 
     list_3.append(i) 
    else: 
     list_3.append(i * -1) 
sum(list_3) 
+0

上記のすべてを1つのループに簡単に組み合わせることができます。それ以外は、コードは問題ありません。 –

答えて

3

これはあなたの仕事のためのワンライナーのようになります。

s = sum((-1)**i * 4/(2*i+1) for i in range(n)) 

何のリストが作成されていないので、それは、より効率的である(.append呼び出されることはありません);あなたのすべての要素のジェネレータを合計します。

あなたは本当にあなたが同様の方法でそれを構築することができ、あなたの要素のリスト(だけでなく和)が必要な場合:

lst = list((-1)**i * 4/(2*i+1) for i in range(n)) 
+0

あなたの数字のうちの少なくとも1つを、範囲(n)のiの 'sum((-1)** i * 4.0 /(2 * i + 1))'のように浮動小数点数にする必要があります。あなたに正しい答えを教えてください。 – steveb

+0

@stevebこれで何が勝つだろうか? –

+0

あなたのコードを '2'で実行してから' 2.0'を使うと、現在の2つの整数を分けている(例えば、1/3 = 0、1/3.0 = 0.33333)答えが異なることが分かります。これはPython 2.7xにも当てはまりますが、3xは浮動小数点を使用せずにOKです。 – steveb

0

あなたが機能を使って、このような何かを試すことができます。

def calc4DivX(n): 
    signal = 1 
    list_values = [] 
    for k in range(n): 
     if signal == 1: 
      list_values.append(4/n) 
     else: 
      list_values.append(-4/n) 
     signal = signal*-1 # signal keeps alternating for every iteraction 
    return sum(list_values) 
#Call the function 
print(calc4DivX(value)) 
関連する問題