【问题标题】:What is a pythonic way to find set of lists which have all common elements?什么是查找具有所有常见元素的列表集的pythonic方法?
【发布时间】:2021-07-13 10:52:44
【问题描述】:

假设我有一个列表a=[[1,2],[1.00000001,2.000000001],[2,3],[4,5],[4.0000000002,5.0000006]],并且我只想得到a=[[1,2],[2,3],[4,5]],因为其他列表的所有元素都靠近列表的其他元素。我们如何在 Python 中做到这一点? set可以以某种方式使用吗?

我尝试使用 numpy 的 allclose 函数,但是我们必须比较列表 a 中的所有 n(n-1)/2 对,这显然是低效的。有没有更高效的 Pythonic 方式来做到这一点?

编辑:我只是在示例中使用了一些整数,输入通常是浮点数。

【问题讨论】:

  • round 到所需的精度,然后使用 set?

标签: python python-3.x list numpy


【解决方案1】:

对于列表中的数据样本和预期结果,由于可以使用 Numpy,我建议使用 dtype 转换为整数并使用 numpy.unique

所以,给定你的清单:

a=[[1,2],[1.00000001,2.000000001],[2,3],[4,5],[4.0000000002,5.0000006]]

你可以这样做:

import numpy as np

a_np = np.unique(np.array(a, dtype=np.uint), axis=0)

print(a_np)
# [[1 2]
#  [2 3]
#  [4 5]]

【讨论】:

  • +1 用于我不知道的巧妙技巧。但对于手头的工作并不方便,因为我的实际数据集也涉及浮点数
【解决方案2】:

如果值是这样的(即看起来像浮点不准确的情况,您可以将值四舍五入到您感兴趣的精度,然后使用 set() 将事物减少为唯一元组:

>>> a=[[1,2],[1.00000001,2.000000001],[2,3],[4,5],[4.0000000002,5.0000006]]
>>> a_r = [tuple(round(v, 2) for v in pair) for pair in a]
[(1, 2), (1.0, 2.0), (2, 3), (4, 5), (4.0, 5.0)]
>>> set(a_r)
{(2, 3), (4, 5), (1, 2)}

【讨论】:

  • 可以说,您可以只使用int 而不是round
猜你喜欢
  • 1970-01-01
  • 2020-06-16
  • 2011-01-28
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 2010-12-03
  • 2012-07-06
  • 1970-01-01
相关资源
最近更新 更多