【问题标题】:How to count values in dictionary and print the key and value associated with the max amount如何计算字典中的值并打印与最大数量相关的键和值
【发布时间】:2014-06-26 12:25:09
【问题描述】:

我创建了一个 anagram 程序,该程序从文件中获取所有单词并打印字母,然后打印文件中可以使用这些字母创建的所有单词。这是它打印出来的一个例子:

cinos ['cions', 'coins', 'icons', 'scion', 'sonic']

现在我已经创建了一个字谜程序,其中有一个字典,其中随机字母作为键,字谜作为值,我想找到具有最多字谜(值)的字母(键)组并打印只是价值观。这是我写的:

from collections import defaultdict

f= open('dictionary.txt')
d= defaultdict(list)
for line in f:
    strip=line.rstrip()
    key = "".join(sorted(strip))
    d[key].append(strip)
count=0
for values in d.values():
    if len(values)>count:
        count=len(values)
        print(values)

这会打印所有分配给 count 的值,但我只想打印与 count 关联的最后一个条目。我尝试了值 [-1],但没有奏效。

【问题讨论】:

  • 我们可以查看整个堆栈跟踪吗?我可能会检查您的代码一段时间并找出导致错误的原因,但如果您只是粘贴整个错误会更容易。

标签: python dictionary max anagram


【解决方案1】:

不清楚你的期望是什么

count="".count(values)

要做,但 Python 试图将其解释为“计算名称 values 引用的字符串对象出现在字符串对象 '' 中的次数”,这将不可避免地以失败告终values 不是字符串对象,'' 无论如何都是空的。

【讨论】:

  • 我把它改成了 len(values)
  • 现在你正试图找到max(len(values));你怎么可能找到单个值的最大值? max 期望它可以迭代的东西,比较它包含的对象的大小,但你给它一个单一的值。
  • 好的,再次改变了一切。这样更好吗?
【解决方案2】:
d = { "taf": ["aft", "fat"], ... }
max_d = max(d.values(), key=len)

我认为这就是你想要做的。你有一些随机字母的字典d 作为键,它们可能的字谜作为值列表。您的目标是返回具有最长值列表的键,对吧?

也就是说,这似乎是令人难以置信的内存密集型。如果我是你,我会这样做:

lst_of_random_letters = ["abcdef", "abcdeg", "abcdeh" ... ] # however you're generating this
def make_anagrams(letters):
    # however you're implementing this
    # but return a list of the anagrams, e.g.
    # [IN] : cions
    # [OUT]: ['cions', 'coins', 'icons', 'scion', 'sonic']

longest_anagrams = max((make_anagrams(letters) for letters in lst_of_random_letters), key=len)

【讨论】:

  • 不,我只需要返回与该键关联的值。这些值包含字谜,这就是我想要列出的全部内容。
  • @user3617808 哦,你确实在你的问题中说过,对不起,我看错了。我已经编辑了两个代码 sn-ps 以反映这种变化。
  • 我再次编辑了 for 循环,并且大部分情况下它都可以正常工作。只是想弄清楚如何告诉它只打印与 count 关联的最后一个值列表,而不是所有列表。
  • @user3617808 仔细想想你的代码在那个 for 循环中做了什么。你如何保存最大的价值?你在保存它吗?你应该吗?另外:你为什么还要用 for 循环来做这个?这就是 max 的真正用途。
【解决方案3】:

您的错误是由以下原因引起的:

count="".count(values)

您将values 提供给它,它已被定义为以下列表中的列表:

d = defaultdict(list)

正如count 的帮助页面所说:

count(...)
    S.count(sub[, start[, end]]) -> int

    Return the number of non-overlapping occurrences of substring sub in
    string S[start:end].  Optional arguments start and end are
    interpreted as in slice notation.

这不太可能奏效。

反而更喜欢:

largest_group = max(d, key=lambda x: len(d[x]))

正如@AdamSmith 所建议的那样(免责声明:我正要写和你发布答案一样的东西)

【讨论】:

  • 无需免责声明。我被他的方法弄糊涂了,把它整块扔掉了,当我们尝试教学时,这可能不是最好的方法:D。但是我在回答中打错了——max(d, key=lambda x: len(d[x])) 是正确的格式。
【解决方案4】:

这会在每个值上调用len 并返回最长的值

max(d.values(), key=len)

如果 2 个或多个值具有相同的长度,您仍然只会得到其中一个

【讨论】:

    猜你喜欢
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多