过滤和映射在一个?(Python)
问题是:过滤和映射在一个?(Python),python,map,filter,Python,Map,Filter,问题是: def detect_monitors_and_modes(preferred_order, binp): out = run_xrandr(binp) findit = partial(get_mon_mode, preferred_order) print 'OUTPUT', '\n'.join(out) lst = map(findit, out) print 'lst', lst matches = filter(lambda x
def detect_monitors_and_modes(preferred_order, binp):
out = run_xrandr(binp)
findit = partial(get_mon_mode, preferred_order)
print 'OUTPUT', '\n'.join(out)
lst = map(findit, out)
print 'lst', lst
matches = filter(lambda x: x, lst)
print 'matches', matches
OUTPUT Screen 0: minimum 320 x 200, current 1366 x 768, maximum 8192 x 8192
LVDS1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 344mm x 194mm
1366x768 60.1*+ 40.1
1360x768 59.8 60.0
1024x768 60.0
800x600 60.3 56.2
640x480 59.9
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
DP1 disconnected (normal left inverted right x axis y axis)
lst [None, 'LVDS1', '1366x768', None, None, None, None, None, None, None, None]
matches ['LVDS1', '1366x768']
具体来说,我想知道是否有一种更简短/更惯用的方法来实现这一点:
lst = map(findit, out)
matches = filter(lambda x: x, lst)
显然,我不能只使用filter
bc,这将返回整行(LVDS1连接1366x768+0+0(正常…
),而不是findit
返回的值。对于不匹配的行,map
返回None
s
(这里的reduce
有什么用处吗?但因为它不是犹太的……)
编辑:我想在这里过滤掉“falsy”值,即空字符串、None
s、False
等等,只保留findit
找到的正匹配项
我想在这里过滤掉“falsy”值,即空字符串、Nones、False等等,只留下findit找到的正匹配
您可以简化为:
matches = filter(None, map(findit, out))
根据文件:
如果函数为None
,则假定标识函数,即删除iterable中所有为false的元素
供参考:
matches = filter(None, map(findit, out))
根据文件:
如果函数为None
,则假定标识函数,即删除iterable中所有为false的元素
供参考:
- 是的,使用列表理解
matches = [findit(x) for x in out if findit(x) is not None]
这是政治公众人物描述的“pythonic”方法。是的,使用列表理解
matches = [findit(x) for x in out if findit(x) is not None]
这是政治公众人物描述的“pythonic”方法,我不确定这是否是pythonic-两次(不必要地)执行findit(x)违反了DRY。为了避免重复,如果y不是None,请
[y代表x输入输出代表y输入[findit(x)]
,虽然这并不能真正最好地显示列表理解。我已经有一段时间没有使用Python了,但这应该可以工作了-基本上是迭代单个项目列表以绑定该变量。可能有更好的方法,但我不记得了。@Steve:我喜欢列表理解,但这会推动它。;-)(我想可以略去不是无
部分,这样会稍微好一点)@John Doe-总是有[x代表x在[findit(y)代表y在外]如果x不是无]
-一个相当直接的map+过滤器版本的音译。我不记得为什么不是无
在那里,而且我懒得把它计算出来,所以它就留在里面了(这个短语解释了大约90%的旧代码,以及至少99.9%的注释)。我不确定这是否真的是python式的-两次(不必要地)执行findit(x)违反了DRY。为了避免重复,如果y不是None,请使用[y for x in for y in[findit(x)]
,虽然这并不能真正最好地显示列表理解。我已经有一段时间没有使用Python了,但这应该可以工作了-基本上是迭代单个项目列表以绑定该变量。可能有更好的方法,但我不记得了。@Steve:我喜欢列表理解,但这会推动它。;-)(我想可以略去不是无
部分,这样会稍微好一点)@John Doe-总是有[x代表x在[findit(y)代表y在外]如果x不是无]
-一个相当直接的map+过滤器版本的音译。我不记得为什么不是无
在那里,而且我懒得把它计算出来,所以它就留在里面了(这个短语解释了大约90%的旧代码,以及至少99.9%的注释)。我想我更喜欢过滤器(bool,map(findit,out))
,因为它感觉没有None
快捷方式那么神奇。你也可以使用列表理解[x for x in map(findit,out),如果x]
,如果你愿意的话。但是在映射()周围没有明智的方法。我想我更喜欢过滤器(bool,map(findit,out))
,因为它感觉没有无
快捷方式那么神奇。你也可以使用列表理解[x代表x在映射中(findit,out),如果x]
,如果你愿意的话。但是我认为在地图()周围没有明智的方法。