如何强制在列表列表中单独处理相同的元素?

2024-06-16 09:32:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个程序来标记词性,生成一个列表。下面是程序中的一个示例函数:

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会找到条件应用的第一个单词(第一个“belied”),并正确地标记它:

[['he', ''], ['is', ''], ['believed', 'passive'], ['to', ''], ['have', ''], ['believed', 'passive']]

但之后,它不知何故将相同的标签应用于列表中条件不适用的其他相同单词(第二个“相信”)。我做错什么了?如何解决这个问题并强制Python独立地处理列表中的每个项目?你知道吗


Tags: to标记程序列表inputishavetagger
1条回答
网友
1楼 · 发布于 2024-06-16 09:32:21

这条线出了问题

prior_word = input_list[input_list.index([x,y]) - 1][0]

^{}返回第一个匹配项的索引。你知道吗

Return the index in the list of the first item whose value is x. It is an error if there is no such item.

你可以用^{}来解决你的问题。改变你的循环和下一行到这些。你知道吗

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),我认为您需要从第二个索引开始,手动填充第一个元素的值。这是因为对于第一个元素,您将没有任何先前的值。有两种解决方法

  1. 从第二个元素开始

    for ind,[x,y] in enumerate(input_list[1:],start=1): 
    
  2. 在你的身体里添加一个条件。你知道吗

    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]
    

相关问题 更多 >