我正在尝试编写一个接受字符串并组合字谜的程序 字符串列表中的字符串,按字典顺序排序。
例如,以下字符串:
eat tea tan ate nat bat
应该产生以下输出(线的顺序很重要):
ate eat tea
bat
nat tan
我写的程序:
from collections import defaultdict
def get_anagrams(source):
d = defaultdict(list)
for word in source:
key = "".join(sorted(word))
d[key].append(word)
return d
def print_anagrams(my_string):
word_source = my_string.split(" ")
d = get_anagrams(word_source)
for key, anagrams in d.items():
print(" ".join(sorted(anagrams)))
print_anagrams("eat tea tan ate nat bat")
该程序产生正确的字谜,但每次运行程序时,行的顺序与预期的输出变化相比较。
所以有时我会
nat tan
ate eat tea
bat
有时我会得到正确的输出
ate eat tea
bat
nat tan
有人可以指出我做错了吗?
答案 0 :(得分:1)
您有dictionary,如果您使用for key, anagrams in d.items():
进行迭代,则无法保证订购:
字典对象的
keys()
方法返回所有字符串的列表 字典中使用的键,以任意顺序(如果你想要它) 已排序,只需将sorted()
函数应用于它。检查一下 单个键在字典中,使用in关键字。
您将这样编辑您的代码,迭代已排序的字典(按键排序):
for key, anagrams in sorted(d.items()):
print(" ".join(sorted(anagrams)))
这可以保证输出始终为
bat
ate eat tea
nat tan
答案 1 :(得分:0)
字典键的顺序是随机设计的。
如果您想按照原始文本的顺序打印anagrams,请使用OrderedDict
按照插入时的顺序存储密钥:
from collections import OrderedDict
def get_anagrams(source):
d = OrderedDict()
for word in source:
key = "".join(sorted(word))
if key not in d:
d[key] = []
d[key].append(word)
return d
def print_anagrams(my_string):
word_source = my_string.split(" ")
d = get_anagrams(word_source)
for key, anagrams in d.items():
print(" ".join(sorted(anagrams)))
print_anagrams("eat tea tan ate nat bat")
输出:
ate eat tea
nat tan
bat