搜索嵌套列表

Searching through nested list

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 词干分析器,它并没有对我正在分析的大量单词进行词干分析。

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

我试图通过查找具有各种语法形式的法语单词列表来解决这个问题。我已经将列表分为两个单独的列表:第一个列表包含我希望其他人采用的词根,而第二个列表是第一个列表中的项目可以采用的变体形式。我这样做是为了让两个列表相互对应。例如,list_1[0] 将对应于 list_2[0] 中的单词。结果,list_2内出现了很多不同长度的嵌套列表。

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

产生 .keys()

如果想获取子列表在主列表中的索引,可以这样做:

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

enumerate(list_2) 迭代 list_2 的元素,它们是您的子列表,并在每一步生成子列表的索引和子列表本身。

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

  • 如果是这种情况,我们将索引和 break 打印出内部 for 循环。
  • 如果我们没有在任何子列表中找到该词,我们将执行 for 循环的 else 部分并打印该词。

您真的只想要一张地图,即 dict。您可以使用以下字典理解快速将当前数据合并到地图中*:

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 的更多信息。请记住,dicts 将 唯一键 映射到值。