从两个元组列表(随机顺序)中取两个值并相乘

时间:2019-02-21 14:26:56

标签: python list tuples tf-idf

我有两个列表,它们是元组列表。

例如

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

但是我的问题是列表随机输出的顺序之一,因此代码不起作用。因此从本质上讲,我需要查看一个列表中的单词是否与另一个列表中的单词匹配,然后乘以以类似于元组列表的方式获得输出。

3 个答案:

答案 0 :(得分:2)

该问题很好地展示了dictionary数据结构的优势以及您的问题如何从中受益。因此,首先,我们将您的元组列表转换为字典(dict-调用),然后根据您的要求“组合”这两个字典,以得到所需的结果。

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数据类型令人困惑,则可以随时将其转换为原始列表。

res = list(res)
print(res)
# [('zaidan', 1.8410476297432288e-06), ('zimmerman', 1.8410476297432288e-06), ('ypa', 1.656942866768906e-05)]

答案 1 :(得分:1)

如果您的数据相同,我会告诉您最简单的解决方案。 对其进行排序:

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

答案 2 :(得分:0)

如果出于某种原因,您不想使用字典(尽管这是一种更好的解决方案),但想要使用列表和元组来执行此操作,那么您正在寻找的是遍历列表并检查是否相等:< / p>

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索引处。