如何根据标签映射字典转换列表列表中的元素?
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
)。
我正在尝试根据标签地图字典转换列表列表的元素。 列表的原始列表如下所示:
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
)。