如何用python编写生成器、列表理解
当我思考任何问题时,通过列表理解来思考并不是自然而然的 思考这个问题的最佳方式是什么 问候如何用python编写生成器、列表理解,python,list-comprehension,Python,List Comprehension,当我思考任何问题时,通过列表理解来思考并不是自然而然的 思考这个问题的最佳方式是什么 问候 Ashish列表理解与考虑for循环的概念相同,只是它们在一行上,您可以将它们作为参数内联使用 myFunc([s.strip() for s in mystrings]) 生成器压缩不会立即在内存中创建列表。当您迭代这些值时,它们会逐步遍历这些值,如果您能够尽早停止循环遍历它们,并且不需要立即获得整个结果,则会更加高效。以下是我对列表理解的看法 1) 我需要输出一个列表 2) 我从一个列表开始 3)
Ashish列表理解与考虑for循环的概念相同,只是它们在一行上,您可以将它们作为参数内联使用
myFunc([s.strip() for s in mystrings])
生成器压缩不会立即在内存中创建列表。当您迭代这些值时,它们会逐步遍历这些值,如果您能够尽早停止循环遍历它们,并且不需要立即获得整个结果,则会更加高效。以下是我对列表理解的看法 1) 我需要输出一个列表 2) 我从一个列表开始 3) 我需要对所有元素执行操作和/或从原始列表中选择特定元素 这就引出了以下结构:
output=[选择器(输入)中x的mangle(x)]
mangle()是一个改变元素的函数。例如,我可以使用x.lower()
使元素小写
我总是使用x
作为迭代器。只是保持所有内容的一致性(我从不在for
循环中将其用作迭代器)
选择器()是一个输出True
或False
的函数。通常这是某种if语句。我主要是用它来测试是否存在,尤其是当我把输出弄得乱七八糟的时候。例如,x表示输入中的x,如果输入
列表理解可能真的很棒。我认为它们确实提高了可读性,而且远远不止是一个巧妙的技巧。但请记住,它们只不过是一个for内联循环
尝试编写循环并尝试将其转换为列表理解可能是最简单的方法。如果您刚开始使用列表理解,我就是这样想的。首先,按照正常方式编写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') ]
嗯 对我来说,例子起了作用。列表理解可能不会自然而然地出现,除非您使用它们来解决一两个
for循环
无法优雅地解决的问题
一些想法(其他可能有更好的例子):
- 给出单词列表,找出长度为5的单词
- 给定一个数字列表,返回素数子集乘以2
- 给出一个幸运饼谚语(或推特)列表,返回一个10个单词以下的谚语列表,并在每个单词的末尾添加“in bed”
选择器(输入)
是一个函数的部分在我看来有点误导。>3)我需要对所有元素执行操作和/或从原始列表中选择特定元素<代码>输出=[选择器(输入)中x的变形(x)]<->输出=[选择器(输入)中x的变形(x)如果选中(x)]
当我需要比较两个或更多单独列表中的元素时如何。。它变成了一种嵌套的理解。然后我就被吹走了。仔细考虑、在空闲状态下测试然后让它运行需要很长时间。有没有优雅的思维方式让它就这么消失了。。我相信会有,而且我认为会使事情变得复杂。。。使用理解时,你的想法和想法是什么。