从两个元组列表中取两个值并相乘

时间:2019-02-20 14:12:14

标签: python tuples tf-idf

我正在计算一个元组列表的TD IDF。我已经计算出TF值,并将其存储在元组列表中,并且计算出了IDF值,该IDF值也存储在元组列表中。例如:

while(f.apply(i) != 0){ //as above: g = ... //should use "the newest" f f = g; //should be used next iteration //then: .... //some other code i = ...; }

>>print(tf)

然后

[(('0', 'CD'), 0.0036429872495446266), (('09:00', 'CD'), 0.0018214936247723133)

>>print(idf

现在,我想将[(('0', 'CD'), 2.4385423487861106), (('09:00', 'CD'), 2.739572344450092)的值乘以0.00364,然后将2.43854乘以0.001821,以便输出以某种方式进行输出: 2.739

Ofc这些只是许多中的2个值,但我不确定如何在同时使用两个列表的同时保持单词的“计算值”。

4 个答案:

答案 0 :(得分:3)

您可以使用列表推导来将两个列表中元组中的第二项相乘,并使用指定的结构构建新列表:

tf = [(('0', 'CD'), 0.0036429872495446266), (('09:00', 'CD'), 0.0018214936247723133)]
idf = [(('0', 'CD'), 2.4385423487861106), (('09:00', 'CD'), 2.739572344450092)]

[(t1, v1*v2) for (t1, v1), (t2, v2) in zip(tf,idf)]

输出

[(('0', 'CD'), 0.008883578684102406), (('09:00', 'CD'), 0.004990113560018382)]

更新

如果元组中的项并不总是相同的顺序,例如:

tf = [(('0', 'CD'), 0.0036429872495446266), (0.0018214936247723133, ('09:00', 'CD'))]

您可以使用以下命令订购它们:

[(t,f) if isinstance(t, tuple) else (f,t) for t, f in tf]
# [(('0', 'CD'), 0.0036429872495446266), (('09:00', 'CD'), 0.0018214936247723133)]

答案 1 :(得分:2)

只需使用列表理解即可。请注意,如果单词顺序不正确,您将把错误的td * idf附加到错误的单词上。为了避免单词的值不匹配,也许您想先sort元组列表。但是,如果tfidf的长度不同,则它将截断较长的列表以匹配较短的列表。这也将带来问题,因为如果有一个额外的元组将每个元组向下移动一个索引,则单词可能不匹配。

result = [(tup1[0], tup1[1]*tup2[1]) for tup1, tup2 in zip(tf,idf)]

答案 2 :(得分:1)

可以将它们都转换为字典:

tf = [(('0', 'CD'), 0.0036429872495446266), (('09:00', 'CD'), 0.0018214936247723133)]

tf_dict = dict(tf)
print(tf_dict) 
>> {('0', 'CD'): 0.0036429872495446266, ('09:00', 'CD'): 0.0018214936247723133}

idf = [(('0', 'CD'), 2.4385423487861106), (('09:00', 'CD'), 2.739572344450092)]
idf_dict = dict(idf)


# now you have same keys in both dicts
res = {k: v*idf_dict[v] for k,v in tf_dict.items()}

答案 3 :(得分:1)

尝试一下:

tf =[(('0', 'CD'), 0.0036429872495446266), (('09:00', 'CD'), 0.0018214936247723133)]
idf= [(('0', 'CD'), 2.4385423487861106), (('09:00', 'CD'), 2.739572344450092)]
output = [(i[0],i[1]*j[1]) for i,j in zip(tf,idf)]

输出将是:

 [(('0', 'CD'), 0.008883578684102406), (('09:00', 'CD'), 0.004990113560018382)]