【问题标题】:More efficient way to find values that only appear once in a list [duplicate]查找仅在列表中出现一次的值的更有效方法[重复]
【发布时间】:2021-01-08 20:02:35
【问题描述】:

由于 TestDome d.o.o. 提出 DMCA 删除请求,此问题的内容已被删除

【问题讨论】:

  • 看看使用collections.Counter
  • @student 要检查设置。我标记了 pandas 或 numpy,因为它们是我可以使用的唯一模块,我在一个非常有限的环境中工作。
  • 如果您想要所有唯一值(在您的示例中为[1, 2, 3]),请使用set。如果您根本不想包含多次出现的值(在您的示例中为[2, 3]),请使用@abc 如下所示的collections.Counter
  • @MarcoA.Paz 为什么你只能使用 numpy 和 pandas? collections.Counter 是对此的“正确”解决方案,您不需要安装任何东西,因为 collections 是 python 的标准库模块之一。
  • 这本质上是Remove duplicates and original from list 的副本(只是表述为构建一个新的list,而不是修改现有的list)。

标签: python


【解决方案1】:

Counter 代表一种有效的方法(线性时间复杂度)。

def find_unique_numbers(numbers):
   return [el for el, cnt in Counter(numbers).items() if cnt==1]

【讨论】:

  • 看cmets; OP 只能导入 pandas 和 numpy。
  • collections.Counter 在标准库中,因此不需要安装。除非这是针对班级分配并且人为限制选项(在这种情况下,为什么允许 pandas 和 numpy,因为它们更高级),否则这是正确的解决方案。
【解决方案2】:

您可以使用dict 来跟踪每个数字的计数。像您目前所做的那样,在 list 上使用它的优势在于,在字典中的查找是 O(1),因此您实际上只迭代列表两次——一次计算所有内容,一次过滤掉所有计数 > 1。

def find_unique_numbers(numbers):
    counts = {}
    for x in numbers:
        # .get(x, 0) returns a default of 0 so you don't have to do if x in counts
        counts[x] = counts.get(x, 0) + 1
    return [key for key, value in counts.items() if value == 1]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2014-12-04
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    相关资源
    最近更新 更多