从两个元组列表中取两个值并相乘
Taking two values from two list of tuples and multiplying
我正在计算元组列表的 TD IDF。我计算了 TF 值并将其存储在元组列表中,我计算了 IDF 值,该值也存储在元组列表中。例如:
>>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
,这样输出可以是任何格式去:
word, td*idf
Ofc 这些只是许多值中的两个值,但我不确定如何在保持 "calculated value" 不变的同时遍历两个列表。
您可以使用列表理解来乘以两个列表中元组中的第二项,并构建具有指定结构的新列表:
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)]
只需使用列表理解。请注意,如果单词顺序不正确,您将结束将错误的 td*idf 附加到错误的单词。为避免单词的值不匹配,也许您想先 sort
元组列表。但是,如果 tf
和 idf
的长度不同,那么它将截断较长的列表以匹配较短的列表。这也会有问题,因为如果有一个额外的元组将每个元组向下移动一个索引,那么单词可能不匹配。
result = [(tup1[0], tup1[1]*tup2[1]) for tup1, tup2 in zip(tf,idf)]
可以将它们都转换为字典:
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()}
试试这个:
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)]
我正在计算元组列表的 TD IDF。我计算了 TF 值并将其存储在元组列表中,我计算了 IDF 值,该值也存储在元组列表中。例如:
>>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
,这样输出可以是任何格式去:
word, td*idf
Ofc 这些只是许多值中的两个值,但我不确定如何在保持 "calculated value" 不变的同时遍历两个列表。
您可以使用列表理解来乘以两个列表中元组中的第二项,并构建具有指定结构的新列表:
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)]
只需使用列表理解。请注意,如果单词顺序不正确,您将结束将错误的 td*idf 附加到错误的单词。为避免单词的值不匹配,也许您想先 sort
元组列表。但是,如果 tf
和 idf
的长度不同,那么它将截断较长的列表以匹配较短的列表。这也会有问题,因为如果有一个额外的元组将每个元组向下移动一个索引,那么单词可能不匹配。
result = [(tup1[0], tup1[1]*tup2[1]) for tup1, tup2 in zip(tf,idf)]
可以将它们都转换为字典:
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()}
试试这个:
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)]