1

appendより長いステートメントをリストに追加すると、読みづらくなると感じます。動的リストの作成に使用できる方法(つまり、最初にゼロで初期化する必要がないなど)が欲しいのですが、私が望むことを行う別の方法を思い付くことができないようです。

例:

import math
mylist = list()
phi = [1,2,3,4] # lets pretend this is of unknown/varying lengths
i, num, radius = 0, 4, 6

while i < num:
    mylist.append(2*math.pi*radius*math.cos(phi[i]))
    i = i + 1

うまくappend機能しますが、私はそれが以下よりも明確ではないと感じています:

mylist[i] = 2*math.pi*radius*math.cos(phi[i])

しかし、その要素はまだリストに存在しないため、これは機能せず、次のようになります。

IndexError: list assignment index out of range


結果の値を一時変数に割り当てて追加することもできますが、それは醜く非効率的なよう です

4

4 に答える 4

12

既存のリストは必要ありません。後で追加します。リスト内包表記を使用するだけ

リスト内包、

  • 速い、
  • わかりやすい、
  • ジェネレータ式として簡単に移植できます

    >>> import math
    >>> phi = [1,2,3,4]
    >>> i, num, radius = 0, 4, 6
    >>> circum = 2*math.pi*radius
    >>> mylist = [circum * math.cos(p) for p in phi]
    

コードを確認します。ここにいくつかの一般的な提案があります

  • 反復で既知の定数を計算しないでください

    while i < num:
        mylist.append(2*math.pi*radius*math.cos(phi[i]))
        i = i + 1
    

次のように書く必要があります

circum = 2*math.pi
while i < num:
    mylist.append(circum*math.cos(phi[i]))
    i = i + 1
  • コンストラクトをwhile使用する代わりにfor-each

    for p in phi:
        mylist.append(circum*math.cos(p))
    
  • 式が読めない場合は、Pythonですべての可読性が重要になった後、式を複数のステートメントに分割します。

于 2012-12-11T11:07:45.657 に答える
2

この特定のケースでは、リスト内包表記を使用できます。

mylist = [2*math.pi*radius*math.cos(phi[i]) for i in range(num)]

または、この種の計算を頻繁に行う場合は、リストの使用をやめて、代わりにNumPyを使用できます。

In [78]: import numpy as np

In [79]: phi = np.array([1, 2, 3, 4])

In [80]: radius = 6

In [81]: 2 * np.pi * radius * np.cos(phi)
Out[81]: array([ 20.36891706, -15.68836613, -37.32183785, -24.64178397])

この最後のバージョンは、すべての中で最も美的に心地よいものだと思います。長い間phi、リストを使用するよりもパフォーマンスが向上します。

于 2012-12-11T11:08:45.070 に答える
1
mylist += [2*math.pi*radius*math.cos(phi[i])]
于 2012-12-11T11:09:25.543 に答える
1

リスト連結を使用できますが、これによると、追加は2倍高速です。

import math
mylist = list()
phi = [1,2,3,4] # lets pretend this is of unknown/varying lengths
i, num, radius = 0, 4, 6

while i < num:
    mylist += [(2*math.pi*radius*math.cos(phi[i]))]
    i = i + 1
于 2012-12-11T11:10:59.443 に答える