如何根据标签映射字典转换列表列表中的元素?

How to convert elements in a list of list according to label map dictionary?

我正在尝试根据标签地图字典转换列表列表的元素。 列表的原始列表如下所示:

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

提前致谢!

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

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

这里有嵌套列表。因此,您应该遍历 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 列表。

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)

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

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

Since map() is written in C and is highly optimized, its internal implied loop can be more efficient than a regular Python for loop. This is one advantage of using map().

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