在 python 列表中删除相似或接近的值并只写入一次

In python lists removing similar or close values and writing only once

我是 python 的新手。我有 2 个列表:(注意:在每个循环中,列表中的值和项目数都会不同)

x = [340, 730, 341]

y = [900, 600, 902]

其中 340,770 和 341 分别是 x1,x2 和 x3: 900,600 和 902 分别是 y1,y2 和 y3。

(注:x和y代表图中某点的x和y轴值)

有没有办法只写一次收盘价?例如,(x1, y1) 的值几乎等于 (x3,y3),因此代码应该选择 (x1,y1) 或 (x3,y3) 中的任何一个,而不是两者。

在给定的情况下输出应该是:

x = [340, 730]

y = [900, 600]

x = [730, 341]

y = [600, 902]

您有 (x,y) 数据。您要根据 (xi,yi) 和 (xj,yj).

之间的差异进行过滤

由于您想同时考虑两个 (x,y),您可能需要使用均方根 (RMS) 比较。

我们会说低于 1% RMS 差异,那么您将 (x,y) 保留在较低的索引处,并在较大的索引处消除 (x,y)。

要使用您提供的信息进行该操作,以下代码应该可以工作,但不是最佳的,而且在大型数据集上肯定会很慢。

仍然:

from math import sqrt

x = [340, 730, 341, 227]

y = [900, 600, 902, 765]

c = 0.01

l = []

ox = []
yx = []

for v in zip(x,y):

    c_rms = sqrt(v[0]**2+v[1]**2)

    for rms in l:
        if abs(c_rms/rms - 1) < c:
            break
    else:
        l.append(c_rms)
        ox.append(v[0])
        yx.append(v[1])

print (ox)
print (yx)

输出:

[340, 730, 227]
[900, 600, 765]

列表l用于存储有效值。对于每个元组 (xi,yi)v,我们计算 RMS 并查看列表 l:如果差异小于截止值 c(此处为 0.01,即 1% ) 使用我们已经保存的索引,那么我们不保存当前 index/RMS (c_rms) 因此我们不保存元组 v 中的元素到输出列表 ox (v[0]) 和 oy (v[1]).

另外,请注意 for ... else 语句的使用。如果循环终止时没有 break,那么 else 将随之而来。如果循环中断,则我们跳过 else。鲜为人知的功能,有时很有用。