Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
过滤和映射在一个?(Python)_Python_Map_Filter - Fatal编程技术网

过滤和映射在一个?(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的元素

供参考:

我想在这里过滤掉“falsy”值,即空字符串、Nones、False等等,只留下findit找到的正匹配

您可以简化为:

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]
      ,如果你愿意的话。但是我认为在
      地图()周围没有明智的方法。