给定一个可迭代对象(如字符串或列表或其他东西),是否有一种干净的、O(n) 方法来制作一个字典,使用 1 行将元素映射到它们的频率?我不想使用任何外部库或模块
该代码应具有与以下代码段相同的功能:
s = 'abcaba'
freq = {}
for i in s:
if i not in freq:
freq[i] = 1
else:
freq[i] += 1
### and now, freq = {'a':3, 'b':2, 'c':1}
这是O(n),但只有几行。我也可以这样做:
s = 'abcaba'
freq = {i: s.count(i) for i in s}
### same thing, now freq = {'a':3, 'b':2, 'c':1}
这是 1 行,但它是 O(n2),因为 count
是 O(n )并且你还有一个循环。
可能有一个我没有想到的简单解决方案。如果这是重复的,我深表歉意。
最佳答案
In [212]: s = 'abcaba'
In [213]: collections.Counter(s)
Out[213]: Counter({'a': 3, 'b': 2, 'c': 1})
这是另一种方法(尽管不完全是一句简单的话):
In [214]: freq = {}
In [215]: for char in s: freq[char] = freq.get(char, 0)+1
In [216]: freq
Out[216]: {'a': 3, 'b': 2, 'c': 1}
关于python - Python 中的一行频率字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66018272/