2015-10-13 40 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