我见过其他Python程序员使用collections模块中的defaultdict来实现以下用例:
from collections import defaultdict
s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
def main():
d = defaultdict(list)
for k, v in s:
d[k].append(v)
Run Code Online (Sandbox Code Playgroud)
我通常使用setdefault来解决这个问题:
def main():
d = {}
for k, v in s:
d.setdefault(k, []).append(v)
Run Code Online (Sandbox Code Playgroud)
文档实际上声称使用defaultdict更快,但我在测试自己时看到了相反的情况:
$ python -mtimeit -s "from withsetdefault import main; s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)];" "main()"
100000 loops, best of 3: 4.51 usec per loop
$ python -mtimeit -s "from withdefaultdict …Run Code Online (Sandbox Code Playgroud) python collections setdefault defaultdict python-collections
这是计算Levenshtein距离的一般算法的教科书示例(我从Magnus Hetland的网站中提取):
def levenshtein(a,b):
"Calculates the Levenshtein distance between a and b."
n, m = len(a), len(b)
if n > m:
# Make sure n <= m, to use O(min(n,m)) space
a,b = b,a
n,m = m,n
current = range(n+1)
for i in range(1,m+1):
previous, current = current, [i]+[0]*n
for j in range(1,n+1):
add, delete = previous[j]+1, current[j-1]+1
change = previous[j-1]
if a[j-1] != b[i-1]:
change = change + 1
current[j] = min(add, delete, change)
return current[n]
Run Code Online (Sandbox Code Playgroud)
然而,我想知道是否有更高效(可能更优雅)的纯Python实现使用difflib的SequenceManager.在玩完之后,这就是我想出的: …