我正在编写一个标记词性的程序,生成一个列表列表。以下是该程序的示例函数:
phrase = [['he',''],['is', ''],['believed', ''],['to',''],['have',''],['believed','']]
def parts_tagger(input_list):
parts = []
for [x,y] in input_list:
prior_word = input_list[input_list.index([x,y]) - 1][0]
if x.startswith('be') and y == '' and prior_word == 'is':
parts.append([x,'passive'])
else:
parts.append([x,y])
return parts
print (parts_tagger(phrase))
当你运行这段代码时,Python找到条件适用的第一个单词(第一个“相信”)并正确标记它:
[['he', ''], ['is', ''], ['believed', 'passive'], ['to', ''], ['have', ''], ['believed', 'passive']]
但是它以某种方式将相同的标签应用于条件不适用的列表中的其他相同单词(第二个“相信”)。我究竟做错了什么?如何解决这个问题并迫使Python单独处理列表中的每个项目?
答案 0 :(得分:4)
问题在于这一行
prior_word = input_list[input_list.index([x,y]) - 1][0]
list.index
返回第一个匹配的索引。
返回 第一项 列表中的索引,其值为x。如果没有这样的项目,则会出错。
您可以使用enumerate
来解决问题。改变你的循环和下一行到这些。
for ind,[x,y] in enumerate(input_list):
prior_word = input_list[ind - 1][0]
输出将按预期进行
[['he', ''], ['is', ''], ['believed', 'passive'], ['to', ''], ['have', ''], ['believed', '']]
当Shawn指出below (in a now deleted comment)时,我认为你需要从第二个索引开始,自己手动填充第一个元素的值。这是因为对于第一个元素,您将不具有任何先前的值。这个
有两种解决方法从第二个元素开始
for ind,[x,y] in enumerate(input_list[1:],start=1):
在您的身体中添加一个条件。
for ind,[x,y] in enumerate(input_list):
prior_index = ind - 1
if prior_index<0:
# Do something
break
prior_word = input_list[ind - 1][0]