【发布时间】:2020-02-06 02:12:07
【问题描述】:
我有一个元组对象列表,它们都具有相同数量的元素。现在我想将所有唯一的元组对象放入不同的列表中。这是一件相对容易的事情。但是,我的元组对象中的元素是 float 类型的。由于舍入错误,某些原本相同的元组,例如 (1.0000000, 5.0000000, 7.0000001) 和 (1.0000001, 5.0000000, 7.0000000),在将它们添加到集合时将被视为唯一的。在这里,我手动添加值,实际上它们将在执行某些计算后分配。那么有没有办法让两个几乎相同的元组在添加到集合时被认为是相同的?
myTuple = (1.0000000, 5.0000000, 7.0000001)
myTuple2 = (1.0000001, 5.0000000, 7.0000000)
myList.append(myTuple)
myList.append(myTuple2)
#add more tuples
mySet = set()
newList = []
for x in myList:
if x not in mySet:
mySet.append(x)
newList.append(x)
【问题讨论】:
-
将值四舍五入到所需的精度之前将它们直接添加到
mySet。 -
@chepner 你建议我将浮点数四舍五入到多少位?
-
有助于形成答案的 2 个问题:它们需要有多接近才能让您认为它们相同?如果您只是考虑数字误差和四舍五入,可能是 1e-3?此外,您是否需要保持数字的全部准确性,或者您可以按照上面的建议进行操作并在之前将它们四舍五入并松开小数点灰尘?比较浮点数通常用一些小的增量来完成......
-
@JeffH 如果可能的话,我想保留几乎相同的浮点数之一的全部准确性。我可以以某种方式快速将每个值与 1e-7 之类的小增量(以检查舍入错误)进行比较吗?我可能在一个列表中有数万个元组,所以使用循环比较它们真的很慢。
-
可能是这样......但你的问题有点令人困惑。如果您使用一些小的增量进行比较,以便将事物放入一组中,您将只保留其中一个......因此,完整的准确性似乎并不重要,因为其中一个或另一个将进入设置,但不能同时设置。对吗?