我正在开发一个anagram程序,其中单词和给定长度的文本文件作为命令参数传递。只应考虑给定长度的字谜。该程序应该只打印最大集合中的单词。如果有几个同样大的组,则应打印所有组。我很困惑。 例: 战神 屁股 耳朵 时代 RASE 烤焦 血清
import sys
from collections import defaultdict
def main():
try:
if len(sys.argv) > 2:
filename = sys.argv[1]
global length
length = int(sys.argv[2])
wordDict = readFile(filename)
print(wordDict)
except IOError:
print("Error: file not found.")
except NameError:
print("Error: a text file and a length are required.")
def readFile(filename):
inFile = open(filename, "r")
try:
return readData(inFile)
finally:
inFile.close()
def readData(inFile):
wd = defaultdict(set)
for line in inFile:
line = line.strip()
if length == len(line):
wd["".join(sorted(line))].add(line)
j = [k for k, v in wd.items() if len(v)==mx]
return j
main()
答案 0 :(得分:2)
首先,你如何获得一些可迭代的最大值?带有max
参数的key
函数,指定您如何度量值。
你如何测量一组的长度? len
函数。
如何获得dict中所有值的可迭代? values
方法(或2.x,itervalues
)。
所以:
max(d.values(), key=len)
例如:
>>> d = {'a': {'a'},
... 'art': {'art', 'rat', 'tar'},
... 'at': {'at', 'ta'}}
>>> max(d.values(), key=len)
{'art', 'rat', 'tar'}
当然,如果有两个同样大的套装,你将会随意获得一套。但由于你只是要求“最大的”,这似乎是一个合理的解释。
如果你想要所有同样最大的套装,有几种方法可以做到。
一个明显的可能性是明确地做到这一点。考虑一下如何实现max
:只检查每个值,如果它大于您目前看到的最大值,那么它就是新的最大值。 (这只是key
函数稍微复杂化;它只是意味着您必须比较key(value) > key(biggest_value)
。)现在,您将如何实现all_max
函数?只需保留一份列表或一组同样大的最大值。如果每个新值都大于任何最大值,则只有一个新值的新列表;如果相等,请将其添加到现有列表中。
但是如果你考虑一下,你可以再次使用相同的多dict技巧:创建一个dict映射长度到这个长度的集合。 (你确实需要一个小技巧:套装不可清洗,但是冻结了。)然后你只选择最大的长度。当然,如果你不需要dict除了第一次查找之外的任何东西,那么存储它就会浪费内存,但是这些东西经常重复使用。
>>> length_d = defaultdict(set)
>>> for value in d.values():
... length_d[len(value)].add(frozenset(value))
>>> max(length_d)
3
>>> length_d[max(length_d)]
{frozenset(['rat', 'art', 'tar'])}
好的,在我的例子中并不是特别令人兴奋,因为只有一个长度为3的集合,但你明白了。
如果你想要一些更简洁的东西,代价是一点性能(它将是对数线性时间而不是线性),你总是可以按大小排序(sorted(d.values(), key=len, reverse=True)
),然后迭代直到你得到一个较小的值(例如,itertools.takewhile
)。