在O(n)时间内从Counter检索第一个元素

时间:2019-04-04 09:41:05

标签: python

我有这样一个数字列表

In [72]: nums                                                                                                                 
Out[72]: [4, 1, 2, 1, 2]

尝试从列表中获取唯一编号

n [72]: nums                                                                                                                 
Out[72]: [4, 1, 2, 1, 2]

In [73]: c = Counter(nums)                                                                                                    

In [74]: c                                                                                                                    
Out[74]: Counter({4: 1, 1: 2, 2: 2})

我可以从计数器看到结果,它是4:1,但是无法在O(1)时间检索到它

In [79]: list(c)[0]                                                                                                           
Out[79]: 4 #O(n) time

是否有可能在O(1)时间获得4

1 个答案:

答案 0 :(得分:1)

根据对问题的评论,您想要获得计数为1的元素。但是仍然不清楚您要确切获得的内容,因为上下文中的“第一个元素”一词尚不清楚Counter的值,它是dict,内部没有定义的顺序。

以下是一些选项(我使用str而不是int来使值和计数更加清晰):

>>> import collections
>>> input_str = 'awlkjelqkdjlakd'
>>> c = collections.Counter(input_str)
>>> c
Counter({'l': 3, 'k': 3, 'a': 2, 'j': 2, 'd': 2, 'w': 1, 'e': 1, 'q': 1})

获取所有计数为1的元素(取O(k),其中k是不同元素的数量)

>>> [char for char, count in c.items() if count == 1]
['w', 'e', 'q']

获取一个计数为1的元素(随机,未指定)(取O(k),因为必须构建列表):

>>> [char for char, count in c.items() if count == 1][0]
'w'

这可以通过使用生成器来改进,因此不会建立完整列表;找到第一个计数为1的元素时,生成器将停止,但是无法知道该元素是第一个,最后一个还是中间...

>>> g = (char for char, count in c.items() if count == 1)
>>> g
<generator object <genexpr> at 0x7fd520e82f68>
>>> next(g)
'w'
>>> next(char for char, count in c.items() if count == 1)
'w'

现在,如果要查找输入数据的第一个元素的计数(在我的示例中为input_str),则在O(1)中完成,因为它是一个list项目访问,然后进行dict查找:

>>> elem = input_str[0]
>>> elem
'a'
>>> c[elem]
2

但是如果没有更多有关您真正需要什么的信息,我无法给出更具体的答案。