【问题标题】:Modifying the first element of each tuple in a list of list by getting a dictionary value通过获取字典值来修改列表列表中每个元组的第一个元素
【发布时间】:2020-09-10 21:52:40
【问题描述】:

我有一个大约 40 个列表的长列表,每个列表都包含一定数量的元组。每个元组都有一个 ID 和一个分数。这是它的样子(为了便于说明,我把它大大缩短了):

[[(31, 0.27253215992549495), (1, 0.19154703077923324), (2, 0.19154703077923324)], [(838, 0.23670500362094776), (849, 0.23670500362094776), (790, 0.19360388648088026),  (406, 0.05016758978027092), (486, 0.05016758978027092), (141, 0.045542436270797924)]]

每个 id 对应于名为 dictionary_en 的字典中的一个条目,我知道我可以将 id(每个元组的第一个元素)转换为 dictionary_en.get(id)。我尝试了几种方法,但似乎无法直接使用(元组是不可变的?),并且尝试将每个元组转换为列表,我得到一个错误

TypeError: 'list' 对象不可调用

我想要的是用dictionary_en.get(id) 替换每个id,所以我最终得到类似的东西):

[[('precaution', 0.27253215992549495), ('avoid', 0.19154703077923324), (bag, 0.19154703077923324)], [('passed', 0.23670500362094776), ('shoe', 0.23670500362094776), ('air', 0.19360388648088026),  ('house', 0.05016758978027092), (eat, 0.05016758978027092), (talk, 0.045542436270797924)]]

我不介意每个元组是否需要改为列表。

感谢任何帮助!

【问题讨论】:

    标签: python nlp


    【解决方案1】:

    这就是你要找的吗?

    >>> id_to_word = {1:'Word 1', 2:'Word2', 3:'Word3'}
    >>> id_to_val = [(1, 0.1), (2, 0.2), (3, 0.3)]
    >>> [(id_to_word.get(id), weight) for id, weight in id_to_val]
    [('Word 1', 0.1), ('Word2', 0.2), ('Word3', 0.3)]
    

    如果处理二维数组,代码如下:

    >>> id_to_val = [[(1, 0.1), (2, 0.2), (3, 0.3)]]
    >>> [[(id_to_word.get(id), weight) for id, weight in ar] for ar in id_to_val]
    [[('Word 1', 0.1), ('Word2', 0.2), ('Word3', 0.3)]]
    

    【讨论】:

    • 不能直接使用,因为id_to_val更像id_to_val = [[(1, 0.1), (2, 0.2), (3, 0.3)], [(2, 0.3), (3, 0.7)]]。倒塌在列表中,嵌套在一个大列表中。您的代码给了我“ValueError:解压的值太多(预期为 2)”。
    • 我试过[[(id_to_word.get(id), weight) for id, weight in group for group in id_to_val]],但也没有用。
    • @DavidPepin 更新了二维数组的代码。你能确认它是否适合你吗?
    【解决方案2】:

    你是对的。元组是不可变的。您可以尝试list(t) 将其转换为列表。或者将字符串和第二个值放入一个新列表中。或者使用 numpy:

    import numpy as np
    new_list = np.array(your_list)
    

    它会自动将所有元组转换为列表。然后改变你想要的任何东西

    检查一下:

    >>> import numpy as np
    >>> my_list = np.array([(1,2), (3,4)])
    >>> my_list
    array([[1, 2],
           [3, 4]])
    >>> my_list[1,1] = 0
    >>> my_list
    array([[1, 2],
           [3, 0]])
    

    尝试学习 numpy,那么在你的情况下,你也许可以进行矩阵运算而不是深度嵌套的 for 循环。

    【讨论】:

    • 我可以单独转换每个列表,但我似乎无法找到如何将列表中的所有列表转换为数组。
    • 应该不是,我在回答中加了演示代码,你可以查看
    • 谢谢,我会调查的。我正在尝试学习基本的 NLP 知识,所以矩阵运算可能是个好主意。
    猜你喜欢
    • 2017-12-16
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    相关资源
    最近更新 更多