假设我有两个列表tokens_e_set
和tokens_f_set
,我想将两个元素中每个元素的每个可能组合映射为字典t_e_f
中的键。每个键都必须具有1/len(tokens_e_set)
的值。我正在寻找一种以最快的方式完成它的方法,因为我必须使用很长的令牌列表。代码如下:
init_value=1/len(tokens_e_set)
t_e_f=collection.defaultdict(float)
for word_e in tokens_e_set:
for word_f in tokens_f_set:
t_e_f[(word_e,word_f)]=init_value
谢谢!
答案 0 :(得分:0)
使用product
代替嵌套for循环。
由于您使用许多键初始化一个dict,所有键都具有相同的值,因此dict.fromkeys
似乎是最好的方法。
from itertools import product
t_e_f = dict.fromkeys(product(tokens_e_set,tokens_f_set),1.0/len(tokens_e_set))
(作为OP的练习留下的比较时间。)
答案 1 :(得分:0)
比较时间:
C:\Python27>python lib\timeit.py -s "tokens_e_set=tokens_f_set=range(100)" -s "import collections" "t_e_f=collections.defaultdict(float);init_value=1/len(tokens_e_set)" "for word_e in tokens_e_set:" " for word_f in tokens_f_set:" " t_e_f[word_e,word_f]=init_value"
100 loops, best of 3: 2.61 msec per loop
C:\Python27>python lib\timeit.py -s "tokens_e_set=tokens_f_set=range(100)" -s "from itertools import product" "t_e_f = dict.fromkeys(product(tokens_e_set,tokens_f_set),1.0/len(tokens_e_set))"
1000 loops, best of 3: 1.88 msec per loop
这些比例如何作为提问者的练习。