c# - Python 到 c# 减少函数理解

标签 c# python reduce

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

我在这里和其他地方找到了几个来源,说明函数的作用,并且在 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

最佳答案

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

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

它执行 Graham scan首先对点进行排序,然后遍历所有点两次(lhuh 分别代表下半部分和上半部分),每次扫描将点累加到列表。点数用reduce累加,即结果原本为空,将点数一个一个(按排序顺序)传给_keep_left,对每个point 从累积列表中删除导致右转的点。然后将当前点添加到累积列表中。

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

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

关于c# - Python 到 c# 减少函数理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8019079/

相关文章:

swift - 将 `[URLQueryItem]` 减少为 `[String: Any]`

java - 使用 Java 8 和 HashMap 简化 map

c# - WinAPI CreateThread 杀进程

c# - 更改 MDI 窗体的背景

c# - 异常 : Object reference not set to an instance of an object

python - 如何保护 Python 代码不被用户阅读?

c# - 如何调用接受两个模型的 Controller 方法?

python - Scrapy mysql管道错误

python - 通过乘法增加特定行,直到列的总和满足条件

parsing - Bison 转移减少冲突,我不知道在哪里