【问题标题】:Aesthetic way of appending to a list in Python?在 Python 中附加到列表的美学方式?
【发布时间】:2012-12-11 11:05:19
【问题描述】:

将较长的语句附加到列表时,我觉得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


可以只是将结果值分配给临时变量,然后附加它,但这看起来很丑陋且效率低下。

【问题讨论】:

  • 您可以包装原来的 __setitem__ 运算符并编写一个检查边界并根据需要调用 append 的运算符。
  • 我一定会调查的;不过,我并不立即熟悉如何做到这一点。如果您有时间,将不胜感激。谢谢!

标签: python list syntax append


【解决方案1】:

您不需要现有的列表并稍后附加到它。只需使用列表理解

列表理解,

  • 很快,
  • 容易理解,
  • 并且可以很容易地移植为生成器表达式

    >>> 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 中的所有可读性都很重要。

【讨论】:

  • 甚至直接在列表comp中遍历phi
  • 很好的建议。谢谢!就这个特定示例的可读性而言,我喜欢将语句放在一起的想法,因为它对我来说是“两个 pi r,乘以 phi 的余弦”。这样,当我查看代码时,我可以立即看到它正在计算圆的周长。这是我使用附加的“问题”,因为它在阅读代码时会混淆。
【解决方案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,它也将比使用列表更高效。

【讨论】:

  • 这看起来很棒,而且绝对是我想进入的方向。我对 numpy 只是简单熟悉,所以我倾向于只考虑标准库的东西。
【解决方案3】:
mylist += [2*math.pi*radius*math.cos(phi[i])]

【讨论】:

    【解决方案4】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2017-10-15
      • 2021-07-12
      • 2021-08-17
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 2021-12-03
      • 2019-11-07
      • 1970-01-01
      相关资源
      最近更新 更多