我有两个列表,它们是元组列表。
例如
List1 = [('zaidan', 0.0013568521031207597),('zimmerman', 0.0013568521031207597), ('ypa', 0.004070556309362279)]
List2 = [('zimmerman', 0.0013568521031207597), ('ypa', 0.004070556309362279), ('zaidan', 0.0013568521031207597)]
如果项目的顺序相同,我可以使用以下代码将这两个值相乘:
val = [(t1, v1*v2) for (t1, v1), (t2, v2) in zip(tf,idf)]
但我的问题是列表输出随机输出的顺序,所以代码不起作用。所以基本上我需要查看一个列表中的单词是否与另一个列表中的单词匹配,然后相乘以获得与元组列表类似的输出。
这个问题极好地证明了dictionary
数据结构的优势以及您的问题如何从中受益。首先,我们将您的元组列表转换为字典(dict
-calls),然后根据您的要求“合并”两个dicts以获得所需的结果。
lst1 = [('zaidan', 0.0013568521031207597),('zimmerman', 0.0013568521031207597), ('ypa', 0.004070556309362279)]
lst2 = [('zimmerman', 0.0013568521031207597), ('ypa', 0.004070556309362279), ('zaidan', 0.0013568521031207597)]
dct1 = dict(lst1)
dct2 = dict(lst2)
res = {k: v * dct2.get(k, 1) for k, v in dct1.items()}.items()
产生:
dict_items([('zaidan', 1.8410476297432288e-06), ('zimmerman', 1.8410476297432288e-06), ('ypa', 1.656942866768906e-05)])
如果dict_item
数据类型令人困惑,您可以随时将其转换为vanilla-list。
res = list(res)
print(res)
# [('zaidan', 1.8410476297432288e-06), ('zimmerman', 1.8410476297432288e-06), ('ypa', 1.656942866768906e-05)]
如果您的数据相同,我会告诉您最简单的解决方案。只是排序:
ls1 = sorted(ls1, key=lambda tup: tup[0])
ls2 = sorted(ls2, key=lambda tup: tup[0])
val = [(t1, v1*v2) for (t1, v1), (t2, v2) in zip(ls1,ls2)]
如果出于任何原因,您不想使用字典(虽然它是一个优秀的解决方案)但是想要使用列表和元组来执行此操作,那么您要查找的是循环遍历列表并检查相等性:
x = [('zaidan', 0.0013568521031207597),('zimmerman', 0.0013568521031207597), ('ypa', 0.004070556309362279)]
y = [('zimmerman', 0.0013568521031207597), ('ypa', 0.004070556309362279), ('zaidan', 0.0013568521031207597)]
z = []
for item in x:
for _item in y:
if item[0] == _item[0]
z.append((item[0], item[1]*_item[1]))
最后,z
将是一个元组列表,其中包含0
索引处的原始字符串以及1
索引处的乘法结果。