当前位置: 首页 > 知识库问答 >
问题:

在不使用集合的情况下计算出现次数。计数器

慕容宏邈
2023-03-14

我正在尝试检索列表中最频繁和不太频繁的元素

frequency([13,12,11,13,14,13,7,11,13,14,12,14,14])

我的输出是:

([7], [13, 14])

我试了一下:

import collections
s = [13,12,11,13,14,13,7,11,13,14,12,14,14]
count = collections.Counter(s)
mins = [a for a, b in count.items() if b == min(count.values())]
maxes = [a for a, b in count.items() if b == max(count.values())]
final_vals = [mins, maxes]

但我不想使用集合模块并尝试更面向逻辑的解决方案。
你能帮我做没有收集吗?

共有3个答案

百里俭
2023-03-14
s = [13,12,11,13,14,13,7,11,13,14,12,14,14]

occurrences = dict()

for item in s:

    occurrences[item] = occurrences.setdefault(item, 0) + 1

mins = [a for a, b in occurrences.items() if b == min(occurrences.values())]
maxs = [a for a, b in occurrences.items() if b == max(occurrences.values())]

final_vals = [mins, maxs]

集合中的default更适合替换计数器来计算列表中项目的出现次数。但是因为你限制了集合的使用。所以setdefault处理KeyError更优雅。

雷飞虎
2023-03-14
data = [13,12,11,13,14,13,7,11,13,14,12,14,14]
occurrences = {}
for i in data:
     if i in occurrences.keys():
             occurrences[i] += 1
     else:
             occurrences[i] = 1

max_vals = [i for i in occurrences.keys() if occurrences[i] == max(occurrences.values())]
min_vals = [i for i in occurrences.keys() if occurrences[i] == min(occurrences.values())]
蒯宇定
2023-03-14

您可以对< code>dict使用< code>try和< code>except方法来模拟< code >计数器。

def counter(it):
    counts = {}
    for item in it:
        try:
            counts[item] += 1
        except KeyError:
            counts[item] = 1
    return counts

或者,您可以使用< code>dict.get,默认值为< code>0:

def counter(it):
    counts = {}
    for item in it:
        counts[item] = counts.get(item, 0) + 1
    return counts

你应该在理解之外做min()max(),以避免重复计算这个数量(函数现在是O(n)而不是O(n^2):

def minimum_and_maximum_frequency(cnts):
    min_ = min(cnts.values())
    max_ = max(cnts.values())
    min_items = [k for k, cnt in cnts.items() if cnt == min_]
    max_items = [k for k, cnt in cnts.items() if cnt == max_]
    return min_items, max_items

这将按预期工作:

>>> minimum_and_maximum_frequency(counter([13,12,11,13,14,13,7,11,13,14,12,14,14]))
([7], [13, 14])
 类似资料:
  • 问题内容: 是否有更好的方法来计数Java8中的int出现次数 问题答案: 尝试:

  • 问题内容: 给定具有可能重复项的对象的集合,我想最后对每个对象的出现次数进行计数。我通过初始化一个empty ,然后遍历并将对象映射到其计数(每次映射已经包含该对象时增加计数)来实现。 对于计算发生次数的简单逻辑而言,这看起来太冗长。有没有更优雅/更短的方法呢?我对完全不同的算法或特定于Java语言的功能持开放态度,该功能允许使用较短的代码。 问题答案: 查看Guava的Multiset。几乎正是

  • 问题内容: 假设我有一个包含以下值的表。 所以我想构造以下输出。 它仅获取列中每个元素的计数。 我在列出唯一列时遇到了问题。 谁能告诉我该怎么做? 我已经弄乱了和,但是无法获取左侧的值列表。 问题答案: 你是这个意思吗

  • 问题内容: 我正在尝试计算中每行显示的数字,例如: 行显示3次。 一个简单的天真的解决方案将涉及将我所有的行都转换为元组,然后应用,如下所示: 产生: 但是,我担心我的方法的效率。也许有一个提供此功能的内置库。我将此问题标记为,因为我认为它可能具有我正在寻找的工具。 问题答案: 您可以使用另一个问题的答案来获得唯一项目的计数。 使用结构化数组的另一种选择是使用一种void类型的视图,该视图将整行连

  • 问题内容: 我的sql查询获取固件的错误修复验证列表,例如def-456是一张票,要求我对产品进行固件测试。def-456有几个子任务,记录结果。结果记录为:id:abc-123,abc-124,abc-125等(如下表所示)。这些对应的ID的结果为“通过”或“失败”。我需要计算两个值----> 1.尝试次数:在以下示例中,尝试次数将为3/5,有3次通过和2次失败(即通过/通过+失败),在这里我可

  • 问题内容: 我有一个重复条目的单词。 我想计算并保存数据结构中每个单词的出现次数。 我该怎么做? 问题答案: 如果您没有大量的字符串,最短的实现方法是使用方法,如下所示: 输出: