0

假设我有两个列表tokens_e_settokens_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

谢谢!

4

2 回答 2

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 的练习。)

于 2013-02-01T15:08:14.213 回答
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

这些规模如何作为提问者的练习。

于 2013-02-01T16:03:45.130 回答