Python - 在列表中查找特定范围内的总项目数

3

我有一个Python列表,其中包含许多浮点数。我想知道在任意两个整数之间有多少个浮点数。最简单、最有效的方法是什么?

example.py - 如何确定在int(1)和int(8)之间有3个浮点数。

between_List = [1, 1.2, 1.8, 1.45, 8]

请编辑您的问题,它引起了很多混乱,请具体说明。 - The6thSense
3个回答

4
您可以简单地计算某个元素在范围3-4内的出现次数:
l = [3.4,4.5,3.2,5.6]

print(sum(3 <= ele <= 4  for ele in l))
2

或者使用numpy:

import numpy as np

l = [3.4, 4.5, 3.2, 5.6]
arr = np.array(l)

print(((3 <= arr) & (arr <= 4)).sum())
2

如果你想检查一个变量是否为浮点数,可以使用issinstance函数:

  print(sum(3 <= ele <= 4 and isinstance(ele,float) for ele in l))

如果你想准确地计算出两个整数之间的所有浮点数总数:

l = [1.3, 3, 3.4, 34.5, 3.2, 4, 5.6]


def find_fs(l, i, j):
    try:
        start, end = l.index(i), l.index(j)
        return sum(isinstance(ele, float) for ele in islice(l, start + 1, end))
    except IndexError:
        return 0
print(find_fs(l,3, 4))
3

@VigneshKalai,哪里说我的方法是错误的? - Padraic Cunningham
@VigneshKalai,问题不明确,不清楚原帖作者是否只需要“float”类型的对象。如果答案有问题,请解释问题所在,而不是简单地告诉回答者再次阅读问题。编辑:糟糕,我误以为你是原帖作者。 - Cyphase
我理解你的问题,但是问题表述不太清楚。 - user4409008
@PadraicCunningham 我错了,我以为他在问另外一件事,再次道歉。 - The6thSense
@PadraicCunningham,你能否检查元素是否为浮点数,就像op所说的那样,“在两个整数之间有多少个浮点数。” - The6thSense
@VigneshKalai,你是指and isinstance(ele,float)吗?还是从索引为3的位置开始计算,在索引为4的位置之间实际出现了多少个浮点数? - Padraic Cunningham

3

正如其他人所发表的,sum(3 <= x <= 4 for x in l)将在O(n)时间内为任何列表l提供答案。然而,如果您知道l是排序的,则可以在O(lg n)时间内找到答案。

import bisect
# number of values 3 < x < 4
x = bisect.bisect_right(l, 3)
y = bisect.bisect_left(l, 4)
answer = y - x

# or, number of values 3 <= x <= 4
x = bisect.bisect_left(l, 3)
y = bisect.bisect_right(l, 4)
answer = y - x

1
我刚要发同样的帖子 - Padraic Cunningham
我没有检查是否存在任何偏移一错误,请随意发布已更正的版本,如果我有任何细节错误。 - chepner
不错的方法,但它应该只检查“浮点数”,而不是“整数”,这样可以吗? - The6thSense
@VigneshKalai,不要传递l,而是先剥离所有非浮点数:l2 = [ isinstance(x, float) for x in l],然后在对bisect_{left,right}的调用中使用l2代替l。(这当然会破坏O(lg n)的保证。) - chepner
2
它还说他有一个浮点数列表,而不是一个浮点数和其他东西的列表,所以我觉得可以安全地假设每个项目都是浮点数。 - chepner
显示剩余5条评论

2
你需要对在范围内的元素进行求和,并检查其类型。由于范围中可能包含介于其中的整数(例如:1到4之间的所有浮点数),因此需要进行类型检查。

>>> lst = [1, 2.2, 3, 3.3, 3.4, 3.7, 4, 5.5, 6]
>>> st, end = 3, 4
>>> sum(st < x < end and type(x) == float for x in lst)
3

在1和4之间:

>>> st, end = 1, 4
>>> sum(st < x < end and type(x) == float for x in lst)
4

这个特别检查值的类型是否为“float”。我认为这并不是期望的,但无论如何都应该指出来。 - Cyphase
你们两个都有可能是对的,他的问题不够清晰。 - user4409008
@Cyphase 是的,我正在为此进行编辑。OP要求_在任意两个整数之间有多少浮点数_,因此我加入了检查。如果数字是连续的,则不需要检查,但否则就需要。 - Anshul Goyal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接