【问题标题】:Count occurance of number from given range计算给定范围内数字的出现次数
【发布时间】:2020-11-09 16:30:59
【问题描述】:

我的目标是计算 num_lst 中数字的频率到 num_range 的范围内。并将输出显示到字典中,其中 key 是范围,value 是 num_lst 范围内数字的频率。

我看过很多帖子,大多数都使用 numpy 或 pandas 来解决它。但是我想找到不使用 np 和 pd 的传统方法来解决这个问题。谁能给我正确的方向。

num_range = [(0.0, 20.0), (20.0, 40.0), (40.0, 60.0), (60.0, 80.0), (80.0, 100.0)]
num_lst = [x for x in range(100)]

#Preferred output
frequency_dict ={(0.0, 20.0):20, (20.0, 40.0):20, 
                 (40.0, 60.0):20,(60.0, 80.0):20, 
                 (80.0, 100.0):20}

【问题讨论】:

  • 如果范围的步长总是 0,那不就是 num_range[I][1] - num_range[I][0] 吗?或者我想你想要通用解决方案来解决范围可能超出范围或范围有步骤的情况?
  • 你尝试过什么,你是如何定义界限的?

标签: python python-3.x list dictionary


【解决方案1】:

如果所有范围都使用整数,您可以利用集合重叠,seta.intersection(setb) 给出 2 个集合之间的所有共同元素,那么其中的 len 就是有多少共同点:

num_range = [(0, 20), (20, 40), (40, 60), (60, 80), (80, 100)]
num_lst = set(range(100))

frequency_dict = {}
for a,b in num_range:
    frequency_dict[a,b] = len(num_lst.intersection(range(a,b)))

print(frequency_dict)

更一般地说,您可以在范围内使用嵌套循环,看看它是否属于每个类别:

num_range = [(0, 20), (20, 40), (40, 60), (60, 80), (80, 100)]
num_lst = range(100)

frequency_dict = dict.fromkeys(num_range, 0) # initial dictionary has 0 in all entries
for a,b in num_range:
    for i in num_lst:
        if a<=i<b:
            frequency_dict[a,b] += 1

print(frequency_dict)

或者如果你想把它作为一个带有理解的单行:

frequency_dict = {(a,b):sum(a<=i<b for i in num_lst) for a,b in num_range}

如果这个嵌套循环的速度不够快,无法满足您的喜好,这就是为什么这么多人使用 numpy 和 pandas 来实现的原因。

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    相关资源
    最近更新 更多