2017-07-04 140 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