【发布时间】:2017-03-14 02:31:58
【问题描述】:
假设
[1,2,4,4,3,3,3]
且upper_limit为8(所有数字均不大于upper_limit)
如何在upper_limit的帮助下产生3 必须在 O(n+upper_limit) 总时间内运行。
【问题讨论】:
标签: python-3.x loops big-o
假设
[1,2,4,4,3,3,3]
且upper_limit为8(所有数字均不大于upper_limit)
如何在upper_limit的帮助下产生3 必须在 O(n+upper_limit) 总时间内运行。
【问题讨论】:
标签: python-3.x loops big-o
a = [1,1,2,2,2,3,3,4]
cnt = {}
most = a[0]
for x in a:
if x not in cnt:
cnt[x] = 0
cnt[x] += 1
if cnt[x] > cnt[most]:
most = x
print(most)
【讨论】:
您可以使用collections.Counter
from collections import Counter
lst = [1,2,4,4,3,3,3]
counter = Counter(lst)
most_freq, freq = counter.most_common()[0]
使用字典替代Counter。
from collections import defaultdict
d = defaultdict(int)
lst = [1,2,4,4,3,3,3]
for val in lst:
d[val] = d[val] + 1
most_freq, freq = max(d.items(), key = lambda t: t[1])
此示例会在您通过规避max 函数的需要进行迭代时跟踪最频繁的情况。
from collections import defaultdict
d = defaultdict(int)
lst = [1,2,4,4,3,3,3]
most_freq, freq = None, 0
for val in lst:
d[val] = d[val] + 1
if d[val] > freq:
most_freq = val
freq = d[val]
print(most_freq, freq)
如果您不想使用defaultdict,那么您可以使用普通字典并改用dict.setdefault。
d = {} # set d to dict
d[val] = d.setdefault(val, 0) + 1
【讨论】:
O(n + len(dict)) Counter 比字典更快,但我相信它大致相同。