我被指派在列表清单中将ana克分组,lexcicographicaly。
以下是其中一个测试用例:
输入:
eat tea tan ate nat bat
输出:
ate eat tea
bat
nat tan
但是,我不断收到类似的错误:TypeError: 'type' object is not iterable
我设法通过将anagramDict = OrderedDict(list)
更改为anagramDict = defaultdict(list)
来修复此错误,但这导致代码在每次运行程序时以随机顺序打印所有三行。
有没有办法解决这个问题,以便程序输出完全,就像上面显示的那样?
这是我到目前为止所做的:
import sys
from collections import *
def findAnagrams(string):
anagramDict = OrderedDict(list)
for word in string:
key = ''.join(sorted(word))
anagramDict[key].append(word)
return anagramDict
def main():
for string in sys.stdin:
stringList = string.split()
if len(stringList) == 0:
break
anagramDict = findAnagrams(stringList)
for key,anagrams in anagramDict.items():
if len(anagrams) >=1:
print(' '.join(sorted(anagrams)))
print ()
main()
注意:运行此程序的机器从stdin / keyboard读取输入并将输出打印到控制台(stdout)。
答案 0 :(得分:4)
您无法通过OrderedDict
list
这样的论点。因为当使用OrderedDict
时,它的参数应该是一个可迭代的(如元组列表等),从中可以创建有序字典。
使用OrderedDict时,您可以使用dict.setdefault()
来获得类似的效果。示例 -
def findAnagrams(string):
anagramDict = OrderedDict()
for word in string:
key = ''.join(sorted(word))
anagramDict.setdefault(key, []).append(word)
return anagramDict
另外,需要注意的另一件事是OrderedDict
保持密钥发送给它的顺序,它不按字典顺序排序。
为此,一种简单的方法是在尝试在main()
函数中迭代它时对其进行排序。示例 -
def main():
s = [input()]
for string in s:
stringList = string.split()
if len(stringList) == 0:
break
anagramDict = findAnagrams(stringList)
for key, anagrams in sorted(anagramDict.items() ,key=lambda x: sorted(x[1])):
if len(anagrams) >=1:
print(' '.join(sorted(anagrams)))
print ()
对于此方法,您甚至不需要使用OrderedDict
,只需使用正常使用的defaultdict
或使用dict.setdefault
的普通字典。
演示 -
输入 -
eat tea tan ate nat bat
输出 -
ate eat tea
bat
nat tan