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

Python 从两个元组列表中获取两个值并相乘,python,tuples,tf-idf,Python,Tuples,Tf Idf,我正在计算元组列表的TD-IDF。我计算了TF值,它存储在一个元组列表中,我计算了IDF值,IDF值也存储在一个元组列表中。例如: tf = [(('0', 'CD'), 0.0036429872495446266), (0.0018214936247723133, ('09:00', 'CD'))] >打印(tf) [('0','CD'),0.0036429872495446266),('09:00','CD'),0.001821493624723133) 然后 >打印(idf [('0',

我正在计算元组列表的TD-IDF。我计算了TF值,它存储在一个元组列表中,我计算了IDF值,IDF值也存储在一个元组列表中。例如:

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

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

然后

>打印(idf

[('0','CD'),2.4385423487861106),('09:00','CD'),2.73957234445092)

现在,我想将
0.00364
的值乘以
2.43854
,然后将
0.001821
乘以
2.739
,这样输出的格式可以是:
word,td*idf


Ofc这些仅仅是2个值,但我不确定如何在保留单词“计算值”的同时迭代这两个列表。

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

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)]
输出

更新

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

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附加到错误的单词的操作。为了避免单词的值不匹配,您可能希望先对元组列表进行排序。但是,如果
tf
idf
的长度不同,则它将截断较长的l如果有一个额外的元组将每个元组向下移动一个索引,那么单词可能不匹配

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

可以将它们转换为dicts:

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)]

太好了。谢谢。我可以在9分钟内接受答案。如果每次运行后我的列表的顺序不同,并且我仍然想进行计算,那么我的方法是什么?因为您的代码假设单词的顺序相同?谢谢,但我想您误解了。我的意思是,例如,如果元组的顺序不同,即
[(('09:00','CD'),0.00182149362447723133),('0','CD'),0.0036429872495446266))
我明白了。问题是,这是一个不同的问题,会导致完全不同的答案。我建议你再问一次,我相信你很快就会得到解决办法:-)