如何以有效的方式将单词列表转换为邻接列表

时间:2018-06-21 12:34:21

标签: python graph adjacency-list

说我有一个单词列表。如果一个单词的最后一个字母与另一个单词的第一个字母相同,那么我们可以将它们连接在一起。我们不会将单词与其自身联系起来。输入元素是不同的。

例如:苹果-大象-塔-等级

我是这样实现的。

def transform(lst):
    graph = []
    for picked in lst:
        link = []
        i = lst.index(picked)
        rest = lst[:i]+lst[i+1:]
        for compare in rest:
            if picked[-1] == compare[0]:
                link.append(compare)
        if len(link) != 0:
            graph.append(link)
    return graph

我不知道我是否还能改善它。

================================================ ======================

我认为我应该改变

if len(link) != 0: graph.append(link)

graph.append(link)

否则,相邻列表的顺序将混合在一起

2 个答案:

答案 0 :(得分:3)

您应该从此处识别要分组的两件事开始。结束字母和起始字母。将所有单词放到两个字典中,每个字典都加一个键,您将得到很多更快的查找。 list.index是效率的杀手,每次查找的成本为 O(n)

from collections import defaultdict

startswith, endswith = defaultdict(list), defaultdict(list)

wordlist = ['apple','elephant','tower','rank']
for word in wordlist:
    startswith[word[0]].append(word)
    endswith[word[-1]].append(word)

那么这应该是一个相当简单的图遍历问题。

答案 1 :(得分:1)

好笑! 我希望我明白你在说什么。

def transform(lst):
    graph = []
    for picked in lst:
        if len(graph)==0:
            graph.append(picked)
        else:
            ch=graph[len(graph)-1][len(graph[len(graph)-1])-1]
            world_ch=[i for i in lst if ((i not in graph)and(i[0]==ch)) ]
            if len(world_ch)==0: break
            else: graph.append(world_ch[0])
    return(graph)

lista=['apple','carloh','horse','apple','elephant','tower','rank']

print(str(transform(lista)))
  
    

['apple','elephant','tower','rank']

  
print(str([[i] for i in transform(lista)]))
  
    

[['apple'],['elephant'],['tower'],['rank']]