希望你的代码能帮上忙。你知道吗
对于generator,这是一个很好的例子。您有一个iterable(traces),想要做一些相当复杂的事情来创建一个新的iterable(length):nList = [[[0, 0, 0], [3, 2, 1]],
[[]],
[[1, 1, 12]],
[[0, 0, 0], [30000, 40, 3010], [32000, 40500, 7520], [0, 0, 10520]],
[[15340, 0, 0], [104300, 0, 3630], [434000, 4434000, 63460],
[400340, 404300, 9430], [10340, 0, 1334320]]]
def calculate_length(x1, y1, x2, y2):
return math.sqrt((x1-x2)**2 + (y1 - y2)**2)
def calculate_time (t1,t2):
return abs(t1-t2)
def lengths(traces):
previous_x, previous_y = 0, 0
for trace in traces:
for index, point in enumerate(trace):
if point:
x, y, t = point
if index > 0:
yield calculate_length(x, y, previous_x, previous_y)
previous_x, previous_y = x, y # Was this intended?
print(max(lengths(nList)))
在代码中,您从未设置prevX和prevY,我认为这是一个bug。我猜你想要什么。你知道吗
请注意我所做的更改—首先,在Python中按索引迭代是缓慢的、不可读的,而且通常不是一个好主意—Python for循环直接在iterables上迭代,不需要计数。如果您需要索引(在第二种情况下检查它是否不是第一个值),我们也可以使用enumerate()来获得它。你知道吗
一旦我们有了一个长度的iterable,使用max()内置函数获得最大长度就很简单了。你知道吗
如果希望每个跟踪的最大长度,而不是整个数据集的长度,可以简单地更改函数的工作级别(删除最外层的循环并将输入参数更改为trace),然后在list comprehension内调用它,例如:def lengths(trace):
previous_x, previous_y = 0, 0
for index, point in enumerate(trace):
if point:
x, y, t = point
if index > 0:
yield calculate_length(x, y, previous_x, previous_y)
previous_x, previous_y = x, y
print([max(lengths(trace)) for trace in nList])
最后,我还将代码样式更改为匹配PEP8——这并不重要,但它有助于使您的代码与您将发现的大多数示例保持一致,并使您更容易一眼就识别出内容。这主要意味着我已经重命名了变量。你知道吗