说我有一个单词列表。如果一个单词的最后一个字母与另一个单词的第一个字母相同,那么我们可以将它们连接在一起。我们不会将单词与其自身联系起来。输入元素是不同的。
例如:苹果-大象-塔-等级
我是这样实现的。
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)
否则,相邻列表的顺序将混合在一起
答案 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']]