【问题标题】:How to convert elements in a list of list according to label map dictionary?如何根据标签映射字典转换列表列表中的元素?
【发布时间】:2021-02-06 02:43:30
【问题描述】:

我正在尝试根据标签映射字典转换列表列表的元素。 这个原始列表看起来像:

original= [['0','1','2'],
           ['0', '0', '0', '0', '0', '0', '0', '1', '2', '0'],
           ['0', '0', '1', '2', '0', '0', '0', '0']]

我要转换original中的元素的标签映射字典根据:

twitter_label_map = {'0':'O', '1':'B_A', '2':'I_A'}

想要的输出应该是这样的:

desired = [['O','B_A','I_A'],
           ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'B_A', 'I_A', 'O'],
           ['O', 'O', 'B_A', 'I_A', 'O', 'O', 'O', 'O']]

我试过这样做:

desired = [[twitter_label_map[old_label] for labels_list in original] for old_label in labels_list]

但是这给了我以下错误:

NameError: name 'labels_list' is not defined

提前致谢!

【问题讨论】:

    标签: python dictionary nested-lists data-conversion


    【解决方案1】:

    您在正确的轨道上,但在您的列表理解中混淆了变量。

    您在这里有嵌套列表。因此,您应该循环遍历original 中的每个sublist,然后将twitter_label_map 应用于sublist 中的每个元素e

    original = [
        ['0', '1', '2'],
        ['0', '0', '0', '0', '0', '0', '0', '1', '2', '0'],
        ['0', '0', '1', '2', '0', '0', '0', '0']
    ]
    
    twitter_label_map = {'0': 'O', '1': 'B_A', '2': 'I_A'}
    
    result = [[twitter_label_map[e] for e in sublist] for sublist in original]
    
    print(result)
    

    输出:

    [['O', 'B_A', 'I_A'], ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'B_A', 'I_A', 'O'], ['O', 'O', 'B_A', 'I_A', 'O', 'O', 'O', 'O']]
    

    以上等价于:

    result = []
    for sublist in original:
        sub = []  # transformed sublist
        for e in sublist:
            sub.append(twitter_label_map[e])
        result.append(sub)
    

    换句话说,嵌套循环,我们将每个转换后的sublist 附加到外部result 列表中。

    【讨论】:

      【解决方案2】:

      你的理解嵌套是倒置的。您必须先在外括号中定义labels_list,然后才能在内括号中使用它。考虑嵌套循环。

      【讨论】:

        【解决方案3】:
        desired = [[twitter_label_map[ele] for ele in lst] for lst in original]
        

        输出是:

        [['O', 'B_A', 'I_A'],
        ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'B_A', 'I_A', 'O'], 
        ['O', 'O', 'B_A', 'I_A', 'O', 'O', 'O', 'O']]
        

        列表推导与下面的 for 循环相同:

        desired = []
        for lst in original:
            new_lst = []
            for ele in lst:
                new_lst.append(twitter_label_map[ele])
            desired.append(new_lst)
        

        【讨论】:

          【解决方案4】:

          所有其他答案都明确使用循环。如果您不想使用循环,这里有另一种实现您想要的方法:

          def parse_symbols(symbols_list):
              return list(map(lambda e: twitter_label_map[e], symbols_list))
          
          results = list(map(parse_symbols, original))
          print(results)
          

          输出:

          [['O', 'B_A', 'I_A'], ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'B_A', 'I_A', 'O'], ['O', 'O', 'B_A', 'I_A', 'O', 'O', 'O', 'O']]
          

          根据您的用例,使用 map 可能会产生更好的性能 (source):

          由于 map() 是用 C 语言编写的并且经过高度优化,它的内部 隐含循环比常规 Python for 循环更有效。 这是使用 map() 的优势之一。

          如果您将来需要,此方法还可以让您更轻松地在代码中实现并行处理(请参阅multiprocessing.Pool.map)。

          【讨论】:

            猜你喜欢
            • 2021-09-18
            • 1970-01-01
            • 2022-07-10
            • 1970-01-01
            • 1970-01-01
            • 2016-03-01
            • 2018-10-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多