【问题标题】:When adding two almost identical tuples to a set make them be considered the same当将两个几乎相同的元组添加到一个集合时,使它们被认为是相同的
【发布时间】: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 之类的小增量(以检查舍入错误)进行比较吗?我可能在一个列表中有数万个元组,所以使用循环比较它们真的很慢。
  • 可能是这样......但你的问题有点令人困惑。如果您使用一些小的增量进行比较,以便将事物放入一组中,您将只保留其中一个......因此,完整的准确性似乎并不重要,因为其中一个或另一个将进入设置,但不能同时设置。对吗?

标签: python set


【解决方案1】:

在一天结束的时候,你不需要一个列表和一个集合来保存答案,你可以在集合中找到它们。您可以使用集合推导来制作集合:

# three tuples, 2 equivalent when rounded to 6 places
t1 = (1.12345678, 2.0, 3.0)
t2 = (1.12345671, 2.0, 3.0)
t3 = (5.76, 9.842, 3.001)

inputs = [t1, t2, t3]

decimal_dust = 6

outputs = {( round(x, decimal_dust), round(y, decimal_dust), round(z, decimal_dust) )
    for (x, y, z) in inputs}

print(outputs)

产量:

{(5.76, 9.842, 3.001), (1.123457, 2.0, 3.0)}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多