计算队列中的不同值

Count distinct values in a queue

我正在尝试实现计算队列中不同值数量的方法。 例如,如果队列看起来像这样:[1, 2, 2, 4, 4, 4, 8, 8, 10],那么方法应该 return 5.

所以我创建了这样的函数:

def count_distinct(self) -> int:

        # Test case
        Q = [0, 1, 1, 2, 3, 4, 5, 5, 7, 7, 9, 9, 9, 11, 11]

        if Q.is_empty():
            return 0
        
        count = 1
        current = Q.dequeue()
        
        while (Q.is_empty() is False):

            next = Q.dequeue()

            if current != next:
                count += 1
            
            current = next

        return count

但是,结果很奇怪。

预期结果:9

我的结果:15

有人知道问题出在哪里吗?谢谢

使用 itertools 中的 Counter:

from collections import Counter

l = [1, 2, 2, 4, 4, 4, 8, 8, 10]
c = Counter(l)
>>> len(c)
5

对于您的测试用例:

>>> len(Counter(Q))
9

出于好奇

为什么不使用 set 来获取长度? Set 仅包含唯一值,您似乎并不关心这些值出现的任何特定顺序。

>>> len(set(Q))
9

你可以简单地先排序然后统计数字,除非它与之前的不一样。

a = [1, 2, 2, 4, 4, 4, 8, 8, 10]
a = sorted(a)

last = a[0]
count = 1

for i in range(1, len(a)):
    if a[i] == last: 
        continue
    last = a[i]
    count += 1

print(count)

在您的情况下,我们假设您的代码是 运行 并且您自定义了所有这些额外的方法(出队等)。在这种情况下,最有可能的原因是您的列表变得未排序,因为您创建它。

队列是否像pythonqueue.Queue?

如果 Queue 是 有序的,你的函数看起来是正确的。

import queue

def count_distinct() -> int:

    # Test case
    Q = queue.Queue()
    for x in [0, 1, 1, 2, 3, 4, 5, 5, 7, 7, 9, 9, 9, 11, 11]:
        Q.put(x)

    if Q.empty():
        return 0
    
    count = 1
    current = Q.get()
    
    while (Q.empty() is False):

        next = Q.get()

        if current != next:
            count += 1
        
        current = next

    return count

它return9.