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

2024-10-02 18:20:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个列表,它们是元组列表。你知道吗

例如

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

但是我的问题是列表输出的顺序是随机的,所以代码不起作用。所以本质上我需要看一个列表中的单词是否与另一个列表中的单词匹配,然后相乘得到一个类似于元组列表的输出。你知道吗


Tags: 项目代码列表顺序val单词v2元组
3条回答

如果出于任何原因,您不想使用dictionary(尽管它是一个更好的解决方案),而是想使用列表和元组,那么您需要的是在列表中循环并检查是否相等:

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索引处。你知道吗

这个问题很好地展示了dictionary数据结构的优点以及您的问题如何从中受益。因此,首先,我们将元组列表转换为字典(dict-calls),然后根据需要“组合”这两个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)]

如果你的数据是一样的,我会告诉你最简单的解决方法。 把它整理一下:

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

相关问题 更多 >