我有这样一个数字列表
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
答案 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
但是如果没有更多有关您真正需要什么的信息,我无法给出更具体的答案。