python检查字符串包含所有字符

时间:2015-10-13 23:08:07

标签: python algorithm python-3.x nodes networkx

我读了很长的单词列表,并为列表中的每个单词创建了一个节点。每个节点都有一个属性' word'他们在名单中的位置。

我正在尝试将节点连接到下一个节点,如果下一个节点是上一个节点,只添加一个字母

我还按字母顺序为每个字符排序每个单词,以便CAT - > ACT

我想从每个唯一的起始词到所有可能的链绘制一条边,所以我可以在列表中看到所有可能的链。

例如

A - > AN - > TAN - > RANT

然而A - 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

为什么我看不到IN INW?

此外,AGNRT AGNRST应该在那里,但我不明白为什么,以及很多其他对

你认为我哪里出错?

4 个答案:

答案 0 :(得分:1)

问题在于,您只是比较列表中彼此相邻的单词,即单词ii+1,例如IIN彼此相邻,WINWIND也是如此,但INWIND相距甚远。您似乎想要比较所有可能的单词,这需要更复杂的算法。这是一个想法:

  1. 创建一个字典,其中键是排序的单词,值是实际单词的列表,例如{"ACT": ["CAT", "ACT", "TAC], ...}collections.defaultdict(list)对此有用。
  2. 按长度对单词的完整输入列表进行排序。假设您只有一个单词列表,则可以使用list.sort(key=len)
  3. 遍历按长度排序的列表。对于每个单词,请遍历长度n-1的每个子集。像for i in range(len(word)): process(word[:i] + word[i+1:])这样的东西。您可能需要在此处注意重复。
  4. 对于每个子集,对子集进行排序并在字典中查找。从字典的值(实际单词列表)中的每个单词到更大的单词建立链接。

答案 1 :(得分:0)

您似乎只是将每个节点与另一个节点进行比较,所以

" IN"直接跟随"我"在你的单词列表中,但是" INW"不是直接在" IN"

之后

答案 2 :(得分:0)

看起来像正式的语言问题。你如何处理循环节点?

IN INW在您提供的列表中。

AGNRT AGNRST不在列表中,因为你从一个字母开始,该字母必须在下一个单词中,例如I - > IN,但IN不在AGNRT或AGNRST

答案 3 :(得分:0)

您可以使用第三方python库python-levenshtein来计算Levenshtein Distance这是字符串编辑距离。在您的情况下,唯一允许的“编辑”是列表中下一个字符串/单词上的字符“插入”,因此您还需要验证下一个单词的长度是否加上前一个单词。< / p>

以下是实现我们目标的示例代码:

import Levenshtein as lvst

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

您可以python-levenshtein(全系统)或apt-get安装pip

sudo apt-get install python-levenshtein

sudo apt-get install python3-levenshtein

pip install python-levenshtein