【问题标题】:Python to c# reduce function understandingpython to c# reduce函数的理解
【发布时间】:2011-12-22 13:48:31
【问题描述】:

我很难理解下面用 python 编写的“减少”调用。

我在这里和其他地方找到了几个来源,它们说明了函数的作用,并且 C# 中的列表有一个等效的“聚合”,但我无法理解下面的调用实际上是做什么的 - 期望 -。 .. 可能是因为我真的不知道 '_keep_left' 返回什么?

所以:

1- 谁能帮我告诉我 '_keep_left' 返回什么?

2- , []) 在 reduce 调用中是什么意思?

非常感谢。

TURN_LEFT, TURN_RIGHT, TURN_NONE = (1, -1, 0)

def turn(p, q, r):
    """Returns -1, 0, 1 if p,q,r forms a right, straight, or left turn."""
    return cmp((q[0] - p[0])*(r[1] - p[1]) - (r[0] - p[0])*(q[1] - p[1]), 0)

def _keep_left(hull, r):
    while len(hull) > 1 and turn(hull[-2], hull[-1], r) != TURN_LEFT:
            hull.pop()
    return (not len(hull) or hull[-1] != r) and hull.append(r) or hull

def _graham_scan(points):
    """Returns points on convex hull of an array of points in CCW order."""
    points.sort()
    lh = reduce(_keep_left, points, [])
    uh = reduce(_keep_left, reversed(points), [])
    return lh.extend(uh[i] for i in xrange(1, len(uh) - 1)) or lh

【问题讨论】:

    标签: c# python reduce


    【解决方案1】:
    1. _keep_left 返回一个列表 hull,该列表最初为空。不向左的转弯被移除。当前点被添加到其中,除非它已经是列表中的最后一个元素。

    2. , []) 是要减少的第三个参数。它是初始累加器值,将传递给_keep_left,从而使hull(以及最后的lhuh)初始为空。

    它执行Graham scan,首先对点进行排序,然后对所有点进行两次遍历(lhuh 代表下半部分和上半部分),并且每次扫描都会将点累加到列表中。积分与reduce累加,即结果原本为空,将积分一一传给_keep_left(按排序顺序),对每个点去掉引起右转的点累积的列表。然后将当前点添加到累积列表中。

    _keep_left 的返回值有点棘手:如果列表为空,not len(hull) 返回 True。 hull[-1] != r 检查r(当前点)是否是列表中的最后一个元素。 hull.append(r) 在布尔表达式中只是为了将r 附加到列表的副作用(对我来说看起来有点脏),所以如果hull 的最后一个元素是rhull 将是返回时未附加 r

    换句话说,由于短路,hull 将始终返回,但如果r 不是最后一个元素,则会在返回之前附加它。同样的逻辑应该很容易以一种更好但更冗长的方式实现。

    【讨论】:

    • 感谢非常清晰的解释。我被期望“减少”会返回对迭代有意义的东西所欺骗,而真正的动作要归功于 turn_left 中的“追加”命令!哈哈!
    猜你喜欢
    • 2015-10-24
    • 2013-10-14
    • 2017-03-27
    • 2012-11-13
    • 2017-08-19
    • 2016-11-09
    • 2012-05-12
    • 1970-01-01
    • 2019-08-11
    相关资源
    最近更新 更多