首页 > 解决方案 > 检查子数组是否在数组数组中

问题描述

我有一个数组数组,我在其中存储 x、y、z 坐标和该坐标的测量值,例如:

measurements = [[x1,y1,z1,val1],[x2,y2,z2,val2],[...]]

现在,在为某个坐标添加测量值之前,我想检查是否已经对该坐标进行了测量。所以我只能保持最大val测量。

所以问题是:

[xn, yn, zn, ...] 是否已经在测量中

到目前为止,我的方法是遍历数组并与类似的 sclied 条目进行比较

for measurement in measurements:
    if measurement_new[:3] == measurement[:3]:
        measurement[3] = measurement_new[3] if measurement_new[3] > measurement[3] else measurement[3]

但是随着测量数组越来越大,这是非常低效的。

另一种方法是两个单独的数组coords = [[x1,y1,z1], [x2,y2,z2], [...]]vals = [val1, val2, ...]

这将允许有效地检查现有坐标,[x,y,z] in coords但稍后必须合并数组。

你能提出一个更有效的方法来解决这个问题吗?

标签: python

解决方案


如果您想坚持使用内置类型(如果没有看到下面注释中的最后一点),我建议使用 adict进行测量:

measurements = {(x1,y1,z1): val1,
                (x2,y2,z2): val2}

然后添加一个新值 ( x,y,z,val) 可以简单地是:

measurements[(x,y,z)] = max(measurements.get((x,y,z), 0), val)

笔记:

  • 0in的值measurements.get应该是您期望的值的下限。如果您的值低于 0,则将其更改为适当的下限,这样每当(x,y,z)您的度量中不存在时,就会get返回下限,因此max将返回val. 您还可以避免必须指定下限并编写:

    measurements[(x,y,z)] = max(measurements.get((x,y,z), val), val)
    
  • 您需要使用tuple作为密钥的类型,因此(x,y,z). 这是因为列表不能被散列,因此不允许作为键。

  • 最后,根据您正在执行的任务的复杂性,考虑使用更复杂的数据类型。我建议看一下pandas DataFrames,它们是处理此类事情的理想选择。


推荐阅读