首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我应该如何检查给定的元素是否在列表范围内?

我应该如何检查给定的元素是否在列表范围内?
EN

Stack Overflow用户
提问于 2021-03-14 20:06:19
回答 3查看 63关注 0票数 0
代码语言:javascript
运行
复制
A = [1,1,1,2,4]
count = []
freq = 0
#ranges = [[1, 6], [1, 6], [1, 6], [2, 7], [4, 9]]
for i in A :
        if (i >=  ranges[i][0] and i <=  ranges[i][1]):
            freq = freq + 1
            count.append(freq)

我的计数应该是5,5,5,2,1 (因为在0-5范围内有5个数字,1-6中有5个数字,2-7中有2个数字,4-9中有1个数字。但是我的计数是返回1,2,3,4,5,我假设每次循环都会加1,但是我找不到错误所在。

编辑:我不能迭代范围,因为必须符合O(n),并且不允许导入字典:(

EN

回答 3

Stack Overflow用户

发布于 2021-03-14 20:31:44

如果你想要简单的Python循环:

代码语言:javascript
运行
复制
count = [sum([a >= r0 and a <= r1 for a in A]) for r0, r1 in ranges]

但是,如果您正在寻找比显式Python循环快得多的东西,我建议您使用numpy

代码语言:javascript
运行
复制
A = [1,1,1,2,4]
ranges = [[1, 6], [1, 6], [1, 6], [2, 7], [4, 9]]

a = np.array(A)[:, None]
r = np.array(ranges)

((a >= r[:,0]) & (a <= r[:,1])).sum(axis=0)

提供:

代码语言:javascript
运行
复制
array([5, 5, 5, 2, 1])

附注

Python中“范围”的通常含义是左封闭和右开放:range(a, b)包含a,但不包含b (正如自然所希望的那样)。您的代码似乎表明您正在寻找右闭合区间,所以我在下面的答案中模仿了这一点。如果您改变主意,可以将<=修改为<

速度

代码语言:javascript
运行
复制
def fun(A, ranges):
    r = np.array(ranges)
    a = np.array(A)[:, None]
    return ((a >= r[:,0]) & (a <= r[:,1])).sum(axis=0)

n, m = 10_000, 100  # 2M comparisons
A = np.random.randint(0, 100, size=m)
ranges = np.random.randint(0, 100, size=(n, 2))

d0 = %timeit -o fun(A, ranges)
# 2.25 ms ± 3.24 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

d1 = %timeit -o [sum([a >= r0 and a <= r1 for a in A]) for r0, r1 in ranges]
# 2.03 s ± 6.88 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

d1.average / d0.average
# 899x speedup
票数 2
EN

Stack Overflow用户

发布于 2021-03-14 20:36:50

通过将ranges中每个列表中的值作为参数传递给range()函数,这应该是可行的。

代码语言:javascript
运行
复制
A = [1,1,1,2,4]
count = []
freq = 0
ranges = [[1, 6], [1, 6], [1, 6], [2, 7], [4, 9]]

for r in ranges :
    count.append(sum([x in range(*r) for x in A]))

print(count) # --> [5, 5, 5, 2, 1]
票数 1
EN

Stack Overflow用户

发布于 2021-03-14 21:21:54

这是修改dgcode的答案:

代码语言:javascript
运行
复制
from collections import Counter
A = [1,1,1,2,4]
c = Counter(A)
sc = set(c)
count = []
freq = 0
ranges = [[1, 6], [1, 6], [1, 6], [2, 7], [4, 9]]

for r in ranges :
    count.append(sum(c[i] for i in set(range(*r))&sc))

print(count) # --> [5, 5, 5, 2, 1]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66624337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档