什么时候删除列表理解和Python的方式?

2024-10-02 16:30:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个行,以下面的方式将一个对象附加到列表中

>>> foo = list()
>>> def sum(a, b):
...      c = a+b; return c
...
>>> bar_list = [9,8,7,6,5,4,3,2,1,0]
>>> [foo.append(sum(i,x)) for i, x in enumerate(bar_list)]
[None, None, None, None, None, None, None, None, None, None]
>>> foo
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
>>>

线

^{pr2}$

会给一个pylint W1060表达式赋值为nothing,但由于我已经在使用foo list来附加值,所以不需要将list理解行赋给某个东西。在

我的问题更多的是关于编程正确性的问题

我应该放弃列表理解而只使用一个简单的for表达式吗?在

>>> for i, x in enumerate(bar_list):
...      foo.append(sum(i,x))

或者,有没有一种正确的方法可以同时使用列表理解和赋值给无?在

回答

谢谢@user2387370,@kindall和@Martijn Pieters。对于其余的注释,我使用append是因为我没有使用list(),我没有使用I+x,因为这只是一个简化的示例。在

我留下如下:

histogramsCtr = hist_impl.HistogramsContainer()
for index, tupl in enumerate(local_ranges_per_histogram_list):
    histogramsCtr.append(doSubHistogramData(index, tupl))
return histogramsCtr

Tags: innone列表forindexreturnfoo表达式
3条回答

是的,这是不好的风格。列表理解就是建立一个列表。您正在构建一个满是Nones的列表,然后将其丢弃。你实际想要的结果是这种努力的副作用。在

为什么不首先使用列表理解来定义foo?在

foo = [sum(i,x) for i, x in enumerate(bar_list)]

如果它不是一个列表,而是某个其他容器类,正如您在另一个答案的注释中所提到的,请编写该类以在其构造函数中接受iterable(或者,如果不是您的代码,则将其子类化为这样做),然后向它传递一个生成器表达式:

^{pr2}$

如果foo已经有一些值,并且您希望附加新项:

foo.extend(sum(i,x) for i, x in enumerate(bar_list))

如果您真的想使用append()并且出于某种原因不想使用for循环,那么您可以使用这个结构;生成器表达式至少可以避免在您不想要的列表上浪费内存和CPU周期:

any(foo.append(sum(i, x)) for i, x in enumerate(bar_list))

但是这比常规的for循环要差得多,而且还有一些额外的工作要做:any在每次迭代中测试foo.append()的返回值。您可以编写一个函数来使用迭代器并消除检查;最快的方法是使用零长度collections.deque

from collections import deque
do = deque([], maxlen=0).extend

do(foo.append(sum(i, x)) for i, x in enumerate(bar_list))

这实际上是相当可读的,但我相信它实际上并不比any()快,并且需要额外的导入。但是,do()或{}都比for循环快一点,如果需要考虑的话。在

我认为仅仅为了副作用而使用列表理解通常是不受欢迎的,所以在这种情况下我会说for循环更好。在

但不管怎样,你就不能这样做吗?在

你应该绝对放弃列表理解。结束。在

  • 你把读你代码的人搞糊涂了。你正在建立一个副作用清单。在
  • 你正在支付CPU周期和内存来构建一个你要再次丢弃的列表。在

在你的简化案例中,你忽略了你可以直接使用列表理解的事实:

[sum(i,x) for i, x in enumerate(bar_list)]

相关问题 更多 >