以下行为对我来说似乎有点违反直觉(Python 3.4):
>>> [(yield i) for i in range(3)]
<generator object <listcomp> at 0x0245C148>
>>> list([(yield i) for i in range(3)])
[0, 1, 2]
>>> list((yield i) for i in range(3))
[0, None, 1, None, 2, None]
Run Code Online (Sandbox Code Playgroud)
最后一行的中间值实际上并不总是None
,它们是我们send
进入生成器的任何东西,等价(我猜)到下面的生成器:
def f():
for i in range(3):
yield (yield i)
Run Code Online (Sandbox Code Playgroud)
令我感到有趣的是,这三条线路都很有用.该参考指出,yield
仅在一个函数定义允许的(虽然我可能读错和/或它可能只是已经从旧版本复制).前两行在SyntaxError
Python 2.7中生成,但第三行不生成.
而且,这似乎很奇怪
有人可以提供更多信息吗?
python yield list-comprehension generator generator-expression
家伙.我正试图找到一个问题最优雅的解决方案,并想知道python是否内置了我正在尝试做的事情.
我正在做的是这个.我有一个列表,A
我有一个函数f
,它接受一个项目并返回一个列表.我可以使用列表理解来转换所有内容A
;
[f(a) for a in A]
Run Code Online (Sandbox Code Playgroud)
但这会返回列表清单;
[a1,a2,a3] => [[b11,b12],[b21,b22],[b31,b32]]
Run Code Online (Sandbox Code Playgroud)
我真正想要的是得到扁平化的清单;
[b11,b12,b21,b22,b31,b32]
Run Code Online (Sandbox Code Playgroud)
现在,其他语言都有它; 它传统上称为flatmap
函数式编程语言,而.Net称之为SelectMany
.python有类似的东西吗?有没有一种巧妙的方法来映射列表上的函数并使结果变平?
我试图解决的实际问题是这个; 从目录列表开始,找到所有子目录.所以;
import os
dirs = ["c:\\usr", "c:\\temp"]
subs = [os.listdir(d) for d in dirs]
print subs
Run Code Online (Sandbox Code Playgroud)
currentliy给了我一个列表列表,但我真的想要一个列表.
我开始习惯于在Python中列出理解,但我担心我使用它有些不正确.我已经遇到了几次使用列表理解但是立即从生成的列表中获取第一个(也是唯一的)项目的场景.这是一个例子:
actor = [actor for actor in self.actors if actor.name==actorName][0]
Run Code Online (Sandbox Code Playgroud)
(self.actors包含一个对象列表,我试图找到一个具有特定(字符串)名称的名称,该名称位于actorName中.)
我正在尝试从列表中提取与我正在寻找的参数匹配的对象.这种方法不合理吗?晃来晃去[0]让我觉得有点不安全.
如果我有一个函数matchCondition(x)
,如何删除n
匹配该条件的Python列表中的第一项?
一种解决方案是迭代每个项目,将其标记为删除(例如,通过将其设置为None
),然后用理解来过滤列表.这需要对列表进行两次迭代并改变数据.是否有更惯用或更有效的方法来做到这一点?
n = 3
def condition(x):
return x < 5
data = [1, 10, 2, 9, 3, 8, 4, 7]
out = do_remove(data, n, condition)
print(out) # [10, 9, 8, 4, 7] (1, 2, and 3 are removed, 4 remains)
Run Code Online (Sandbox Code Playgroud) 使Javascript做类似 Python的列表理解的最简洁方法是什么?
在Python中,如果我有一个对象列表,其名称我想"拉出"我会这样做...
list_of_names = [x.name for x in list_of_objects]
Run Code Online (Sandbox Code Playgroud)
在javascript中,除了使用for循环结构之外,我并没有真正看到一种更"漂亮"的方式.
仅供参考:我正在使用jQuery; 也许它有一些漂亮的功能,使这成为可能?
更具体地说,假设我使用jQuery选择器$('input')
来获取所有input
元素,我将如何最干净地name
为每个input
元素创建所有属性的数组- 即,$('input').attr('name')
数组中的所有字符串?
以下简单的LINQ代码
string[] words = { "hello", "wonderful", "linq", "beautiful", "world" };
// Get only short words
var shortWords =
from word in words
where word.Length <= 5
select word;
// Print each word out
shortWords.Dump();
Run Code Online (Sandbox Code Playgroud)
可以使用列表推导将其翻译成python,如下所示.
words = ["hello", "wonderful", "linq", "beautiful", "world"]
shortWords = [x for x in words if len(x) <=5]
print shortWords
Run Code Online (Sandbox Code Playgroud)
我有一个列表理解,近似于:
[f(x) for x in l if f(x)]
Run Code Online (Sandbox Code Playgroud)
其中l是列表,f(x)是返回列表的昂贵函数.
我想避免对f(x)的每次非空出现进行两次f(x)求值.有没有办法在列表理解中保存其输出?
我可以删除最终条件,生成整个列表然后修剪它,但这似乎是浪费.
vec = [[1,2,3], [4,5,6], [7,8,9]]
print [num for elem in vec for num in elem] <----- this
>>> [1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
这是骗我的.
我的理解是ELEM名单从内部列表for elem in vic
我不太明白的用法num
,并for num in elem
在开始和结束.
python如何解释这个?
它看起来的顺序是什么?
由于Java不允许将方法作为参数传递,您使用什么技巧来实现Java中的列表理解?
我有一个字符串列表(ArrayList).我需要使用一个函数转换每个元素,以便我得到另一个列表.我有几个函数,它们将String作为输入,并返回另一个String作为输出.如何创建一个通用方法,可以将列表和函数作为参数给出,这样我就可以获得一个列表,并处理每个元素.在字面意义上是不可能的,但我应该使用什么技巧?
另一种选择是为每个较小的String处理函数编写一个新函数,它只是循环遍历整个列表,这有点不太酷.
如何根据条件中断列表理解,例如何时412
找到数字?
码:
numbers = [951, 402, 984, 651, 360, 69, 408, 319, 601, 485, 980, 507, 725, 547, 544,
615, 83, 165, 141, 501, 263, 617, 865, 575, 219, 390, 984, 592, 236, 105, 942, 941,
386, 462, 47, 418, 907, 344, 236, 375, 823, 566, 597, 978, 328, 615, 953, 345, 399,
162, 758, 219, 918, 237, 412, 566, 826, 248, 866, 950, 626, 949, 687, 217, 815, 67,
104, 58, 512, 24, 892, 894, 767, 553, …
Run Code Online (Sandbox Code Playgroud)