2015-10-13 39 views
-1

我正在閱讀一長串單詞,並且我爲列表中的每個單詞製作了一個節點。每個節點在列表中都有一個屬性「單詞」。python check string contains all characters

我試圖將節點連接到下一個節點,如果下一個節點是一個節點,與另外只有一個字母

我還字母順序排列的每個字符的每一個字,使CAT - > ACT

我想從每個獨特的開始單詞,到所有可能的鏈,從而可以看到列表中所有可能的鏈。

例如

A - > AN - > TAN - > RANT

但是一個--x->牛逼

這是我嘗試

for i in range(0, G.number_of_nodes()-1): 

    if (((len(G.node[i]['word'])+1) == len(G.node[i+1]['word']))  and (G.node[i]['word'] in G.node[i+1]['word'])): 
     print G.node[i]['word'], G.node[i+1]['word'] 

給了我這個,

 
DGO DGOS 
DGOS DGOSS 
I IN 
ELLMS ELLMSS 
AEPRS AEPRSS 
INW DINW 
DINW DINWY 

What the word list and the alphabetical list looks like

爲什麼我沒有看到INW?

此外,AGNRT AGNRST應該是有,但我不明白爲什麼,有很多其它對

如果你覺得我錯在哪裏的相處?

+1

TLDR:我覺得我問的是:我如何檢查是否String2的包含在String1中的任意字符的組合? –

+0

你看過'itertools.combinations()'嗎?看起來像一個好地方開始。 – RobertB

+0

是下一個詞總是在開始或結束時只有BEER - > BEERS而不是BEER - > BEESR? – dopstar

回答

0

你似乎每個節點

「IN」直接跟比較只是一個其他節點,所以「我」在你的單詞表,但「INW」不是「IN」

0

照看直接像一個正式的語言問題。你如何處理循環節點?

IN INW在你給出的列表中。

AGNRT AGNRST不在列表中,因爲你有一個字母開始的時候,這封信已成爲下一個字比如我 - > IN,但不是AGNRT或AGNRST

1

的問題在於你只是比較在列表中相鄰的單詞,即單詞ii+1,例如IIN彼此相鄰,WINWIND也是如此,但INWIND相隔很遠。看起來你想比較所有可能的單詞,這需要更復雜的算法。這是一個想法:

  1. 做一個字典,他們的鍵是排序的單詞,值是實際的單詞列表,例如, {"ACT": ["CAT", "ACT", "TAC], ...}。 A collections.defaultdict(list)將對此有用。
  2. 按長度對單詞的完整輸入列表進行排序。假設您只有一個單詞列表,您可以使用list.sort(key=len)
  3. 遍歷按長度排序的列表。對於每個單詞,請查看長度爲n-1的每個子集。像for i in range(len(word)): process(word[:i] + word[i+1:])。你可能想在這裏小心重複。
  4. 對於每個子集,對子集進行排序並在字典中查找它。從字典的值(實際單詞列表)中的每個單詞鏈接到更大的單詞。
0

您可以使用第三方python庫python-levenshtein來計算Levenshtein Distance這是字符串編輯距離。在你的情況下,唯一允許的'編輯'是你的列表中下一個字符串/字的'插入'字符,所以你還需要驗證下一個字的長度是1加上一個字。

下面是示例代碼,將實現我們的東西:

import Levenshtein as lvst 

if len(word2) - len(word1) == 1 and lvst.distance(word1, word2) == 1: 
    print(word1, word2) 

您可以通過apt-get(系統級)安裝python-levenshteinpip

sudo apt-get install python-levenshtein

sudo apt-get install python3-levenshtein

pip install python-levenshtein