查找给定字符串

时间:2015-09-30 08:12:06

标签: python python-3.x anagram

我正在尝试编写一个接受字符串并组合字谜的程序 字符串列表中的字符串,按字典顺序排序。

例如,以下字符串:

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

有人可以指出我做错了吗?

2 个答案:

答案 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