何时使用列表理解与 for 循环

对于何时首选列表理解而不是循环,是否有一般规则?例如:for


单个 for 循环在转换为理解时非常有用:


l = []

for word in sentence:

    l.append(word)


# [word for word in sentence]

双倍可能也是:


l = []

for word in sentence:

    for letter in word:

        l.append(letter)


# [letter for word in sentence for letter in word]

但是,我认为在那之后可读性会变得非常差。例如,使用 s:if


l = []

for word in sentence:

    if word.startswith('u'):

        for letter in word:

            if letter in ('a', 'b', 'c', 'o'):

                l.append(letter)


# [letter for word in sentence if word.startswith('u') for letter in word if letter in ('a', 'b', 'c', 'o')]

对于循环模式的复杂性,是否有建议,在循环模式中,尝试将其放入列表理解中会更糟?for


当年话下
浏览 101回答 3
3回答

繁星点点滴滴

答案取决于您的意见。但是,由于我确实记得一位在Python社区中备受推崇的书的作者提出的一条具体建议,我可以分享Luciano Ramalho的“Fluent Python”一书中的以下摘录:for 循环可用于执行许多不同的操作:扫描序列以计数或选取项目,计算聚合(总和、平均值)或任意数量的其他处理任务。[...]相比之下,listcomp只做一件事:构建一个新列表。当然,滥用列表理解来编写真正难以理解的代码是可能的。我见过带有listcomps的Python代码,只是为了重复一个代码块的副作用。如果不对生成的列表执行某些操作,则不应使用该语法。另外,尽量保持简短。如果列表理解跨越两行以上,则最好将其拆分或重写为普通的旧 for 循环。使用你最好的判断:对于Python和英语一样,没有硬性规定来清晰地写作。

慕妹3242003

据此,可以获得性能。import timeitdef squares(size):    result = []    for number in range(size):        result.append(number*number)    return resultdef squares_comprehension(size):    return [number*number for number in range(size)]print(timeit.timeit("squares(50)", "from __main__ import squares", number = 1_000_000))print(timeit.timeit("squares_comprehension(50)", "from __main__ import squares_comprehension", number = 1_000_000))5.42920754.1652729000000015希望这有帮助。

炎炎设计

我想补充一点,你总是可以使用生成器和迭代器。没有主要的内存开销,但除非最里面的操作成本相对较高,否则性能可能会受到影响。from itertools import chainsentence = "flat is better than nested"words = sentence.split()f_words = (w for w in words if w.startswith('f'))f_chars = chain(*f_words)good_chars = [c for c in f_chars if c in 'abco']
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python