【发布时间】:2014-03-05 16:21:19
【问题描述】:
我目前正在研究一个递归函数来搜索表示沿河位置的字典。字典使用start作为键索引4个并行数组。
并行数组:
start = 流量累积较小的端点位置,
end = 另一个端点的位置(流量积累较大),
length = 段长度,并且;
shape = 实际形状,定向为从头到尾运行。
字典:
G = {}
for (st,sh,le,en) in zip(start,shape,length,end):
G[st] = (sh,le,en)
我的目标是从p 表示的起点之一沿河流向下搜索,并选择距离为2000 米(以x 表示)的位置,直到end。这是我正在使用 Python 处理的递归函数:
def Downstream (p, x, G):
... e = G[p]
... if (IsNull(e)):
... return ("Not Found")
... if (x < 0):
... return ("Invalid")
... if (x < e.length):
... return (Along (e.shape, x))
... return (Downstream (e.end, x-e.length,G))
目前,当我输入 Downstream ("(1478475.0, 12065385.0)", 2000, G) 时,它会返回一个 keyerror。我检查了key in G 并且该键返回false,但是当我搜索G.keys () 时,它返回由start 表示的所有键,包括给出false 的键。
例如,密钥是(1478475.0, 12065385.0)。我已将此键用作文本和 2 个双精度值的元组,并且两次都返回了 keyerror。
错误:
Runtime error
Trackback (most recent call last):
File “<string>”, line 1, in <module>
File “<string>”, line 1, in Downstream
KeyError: (1478475.0, 12065385.0)
是什么导致了密钥错误,我该如何解决这个问题以达到我的目标?
我在 ArcGIS 中使用 Python,因为它使用的是折线 shapefile 中的属性表,这是我第一次尝试使用递归函数。
这个问题和答案是我在组织数据和编写此递归函数时如何达到这一点的。
例子:
>>> G.keys ()
[(1497315.0, 11965605.0), (1502535.0, 11967915.0), (1501785.0, 11968665.0)...
>>> print G
{(1497315.0, 11965605.0): (([1499342.3515172896, 11967472.92330054],), (7250.80302528,), (1501785.0, 11968665.0)), (1502535.0, 11967915.0): (([1502093.6057616705, 11968248.26139775],), (1218.82250994,), (1501785.0, 11968665.0)),...
【问题讨论】:
-
d、IsNull和Along是什么?哪条特定的行引发了KeyError?您能否提供一个输入数据和预期输出的最小示例? -
d 是一个错字,正确的代码是
e = G[p],上面已修复。 IsNull 仅返回 0 或 noData 值。输入数据现已添加到问题中。预期输出将是下游间隔距离的坐标。我已经添加了指向我的来源的链接。希望这会有所帮助。 -
你试过
Downstream ((1478475.0, 12065385.0), 2000, G)吗?撇开使用浮点值作为字典键组件这一事实不谈,因为某些小数和非常大的值的表示问题,尤其是在执行任何类型的算术时; thedecimalmodule 对于此类目的会更可靠,但如果您只提供一次floats 并且它们只能在其元组/存储值列表中访问它们,那么使用floats 应该不是问题。 -
是的,我也试过了,但仍然收到 keyerror。
标签: python arrays recursion dictionary keyerror