返回集合词典中最长的集合?

时间:2014-10-28 00:45:32

标签: python dictionary set anagram

我正在开发一个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()

1 个答案:

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