如何在python中编写生成器,列表理解

时间:2012-01-12 04:40:47

标签: python list-comprehension

当我想到任何问题时,通过列表理解进行思考并不是自然而然的。

最好的思考方法是什么?

此致 阿希什

4 个答案:

答案 0 :(得分:2)

以下是我对列表推导的看法。

1)我需要输出一个列表

2)我从列表/可迭代开始。

3)我需要对所有元素执行操作和/或从原始列表中选择特定元素。

这引导我进行以下构建:

output = [ mangle(x) for x in selector(input)]

mangle()是一些改变元素的函数。例如,我可能会使用x.lower()来使元素成为小写。

我总是使用x作为迭代器。只是保持一致(我永远不会在for循环中使用它作为迭代器。)

selector()是一个输出TrueFalse的函数。通常这将是某种if语句。我主要使用这个测试存在,特别是如果我mangling输出。例如,x for x in input if input

列表理解可能非常棒。我认为它们确实提高了可读性,并且不仅仅是一个巧妙的技巧。但请记住,它们只不过是一个for循环内联。

尝试编写for循环并尝试将它们转换为列表理解可能是最简单的。

答案 1 :(得分:1)

如果你刚刚开始使用列表推导,那么我就是这样做的。首先按正常方式编写for循环:

results = []

# get all keys that aren't test strings and add to results list
for a in blah.keys():
  if a not in ('test', 'foo'):
    results.append(a)

现在要创建一个列表解析,让for循环和if语句保持相同的顺序并将它们放在同一行,将'final result'代码放在开头:

results = [ results.append(a) for a in blah.keys() if a not in ('test', 'foo') ]

我们快到了!我们不需要手动追加(a),因为我们放入的任何内容都会自动地将表达式的那部分附加到列表中,因此最终的表达式是:

 # get all keys that aren't test strings and add to results list
 results = [ a for a in blah.keys() if a not in ('test', 'foo') ]

HTH!

答案 2 :(得分:0)

列表推导与思考for循环的概念相同,除非它们在一行上,你可以将它们作为参数内联使用。

myFunc([s.strip() for s in mystrings])

Generator comprensions不会立即在内存中创建列表。当你迭代它们时,它们会逐步执行这些值,如果你提前停止循环并且不需要立即获得整个结果,它们会更有效率

答案 3 :(得分:0)

对我来说,例子有所不同。列表推导可能不会自然而然,直到你用它们来解决for loop不能优雅解决的问题。

一些想法(其他人可能有更好的例子):

  • 给出一个单词列表,找到长度为5的单词。
  • 给定一个数字列表,返回素数子集,乘以2
  • 给出一个幸运饼干说法(或推文)列表,返回一个长度不超过10个字的单词列表,并在每个单词的末尾添加“在床上”。