在 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
。鲜为人知的功能,有时很有用。
我是 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
。鲜为人知的功能,有时很有用。