2017-07-04 144 views
0
from nltk import word_tokenize 

list_1 = [a, b, c, d, e, f] 
list_2 = [[aa, bb, cc], [dd, ee], [ff], [gg, hh, ii, jj], [kk, ll], [mm, nn, oo]] 
text = 'The lazy aa moves along the hh' 
text_token = word_tokenize(text) 

for word in text: 
    if word in [j for i in list_2 for j in i]: 
     print(list_2.index(word)) 
    else: 
     print(word) 

ValueError: 'hh' is not in list 

我试图对法文文本的大型机构进行文本分析。我已经尝试过使用NLTK Stemmer,它并没有阻止我分析的大量词汇。通过嵌套列表搜索

我对Python或任何其他编码语言(我来自人文科学)并不是很熟悉,所以我也不完全确定如何搜索我正在寻找的问题,如果这个问题是多余的或者很容易解决的,我对此表示歉意。

我试图通过找到一个法语单词列表与他们的各种语法形式来解决这个问题。我已经将列表编入两个单独的列表中:第一个列表包含我希望其他人采用的单词的根,而第二个列表是第一个列表中的项目可以采用的变体形式。我已经做到这一点,以便两个列表相互对应。例如,list_1[0]将对应于list_2[0]中的字词。因此,list_2中有很多不同长度的嵌套列表。

当我通过嵌套列表进行搜索时,似乎出现了我的问题。我必须遍历text_token以检查中的任何字是否存在于list_2中。如果在list_2中存在text_token,则查找misc = list_2.index(word)。找到misc后,我想用搜索list_1[misc]替换单词。但是,在确认list_2中存在单词之后,我尝试使用print(list_2.index(word))来查看它是否正常工作,但我仍然收到ValueError: 'hh' is not in list我不完全确定如何在已经这样做之后通过嵌套列表循环以避免此错误,因为我假设当我再次搜索定义时,它不会将嵌套列表看作多个项目。我试图通过在原始文件中检查后尝试另一个列表理解来避免这种情况,但最终会返回单个字母。我也尝试将这两个列表放入字典中,但我似乎无法弄清楚如何从.values()产生.keys()

+0

你真的不想使用这样的嵌套列表!使用'dict'! –

回答

0

你真的只想要一张地图,即一个dict。您可以使用以下字典的理解*快速Munge时间你当前的数据到地图:

rootmap = {var:root for root, variants in zip(list1, list2) for var in variants} 

然后你可以使用:

print(rootmap.get(word, word)) 

这里使用了.get方法,它需要一秒钟值作为默认如果第一个参数没有找到。顺便说一句,dict成员资格测试比检查列表更有效,它是一个常量时间操作,而对于列表成员资格测试是线性操作。如果您在list2中使用了许多次变量,这变得更加重要。

*等效也可以使用for循环写:

rootmap = {} 
for root, variants in zip(list1, list2): # iterate over your lists in parallel 
    for var in variants: 
     rootmap[var] = root 

买者

阅读在documentation更多dict秒。请注意,dict的地图的唯一键值为

0

如果你想获得在主列表中的子表的索引,你可以这样做:在list_2的元素,这是你的子表

for word in text: 
    for index, sublist in enumerate(list_2): 
     if word in sublist: 
      print(index) 
      break 
    else: 
     print(word) 

enumerate(list_2)迭代,并且收益率在每一步指数子列表和子列表本身。

然后,我们检查该单词是否在其中一个子列表中。

  • 如果是这样的话,我们打印索引break出内部for循环。
  • 如果我们在任何子列表中找不到该单词,我们将执行for循环的else部分并打印该单词。
+0

完美的工作!非常感谢! – horace