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

您可以使用列表连接,但根据此追加速度是原来的两倍:

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