Python计算字典值为列表的项目数

18

Python 3.3中,字典采用这种形式的键值对。

d = {'T1': ['eggs', 'bacon', 'sausage']}

这些值是可变长度的列表,我需要遍历这些列表中的元素。下面的代码可以实现:

count = 0
for l in d.values():
   for i in l: count += 1

但这很丑。一定有更符合Python风格的方法,但我似乎找不到。

len(d.values()) 

产生1。 它是1个列表(DUH)。来自这里的Counter尝试会导致'unhashable type'错误。

5个回答

52

使用sum()函数和每个字典值的长度:

count = sum(len(v) for v in d.itervalues())
如果你正在使用Python 3,那么只需使用d.values()
与您的输入示例和我的一个示例进行快速演示:
>>> d = {'T1': ['eggs', 'bacon', 'sausage']}
>>> sum(len(v) for v in d.itervalues())
3
>>> d = {'T1': ['eggs', 'bacon', 'sausage'], 'T2': ['spam', 'ham', 'monty', 'python']}
>>> sum(len(v) for v in d.itervalues())
7

在这种情况下,Counter 没有太大的帮助,因为您并不是按每个条目计数,而是计算所有值的总长度。


16
>>> d = {'T1': ['eggs', 'bacon', 'sausage'], 'T2': ['spam', 'ham', 'monty', 'python']}
>>> sum(map(len, d.values()))
7

0
在Treehouse上做作业时,我想到了这个。它可以至少简化一步(据我所知),但对于初学者(像我自己)来说,理解这个版本可能更容易。
dict = {'T1': ['eggs', 'bacon', 'sausage'], 'T2': ['bread', 'butter', 'tosti']}

total = 0

for value in dict:
    value_list = dict[value]
    count = len(value_list)
    total += count

print(total)

0

对我来说,最简单的方法是:

winners = {1931: ['Norman Taurog'], 1932: ['Frank Borzage'], 1933: ['Frank Lloyd'], 1934: ['Frank Capra']}

win_count_dict = {}

for k,v in winners.items():
    for winner in v:
        if winner not in win_count_dict:
            win_count_dict[winner]=1
        else:
            win_count_dict[winner]+=1


print("win_count_dict = {}".format(win_count_dict))

你正在重新发明 defaultdict(int) - tripleee
可能是因为你不知道它的存在?标准库在collections模块中提供了一个组件,可以避免你必须检查键是否已经定义;文档链接。 - tripleee
哈哈,哇!看起来简单易懂啊,笑死我了!太喜欢了,谢谢。 - mluanastevens

-1

我在寻找答案时发现了这个主题,直到我意识到我已经有了可以使用它的代码。这就是我想出来的:

count = 0

for key, values in dictionary.items():
        count = len(values)

如果您想为每个字典项保存计数,可以创建一个新的字典来保存每个键的计数。
count = {}

for key, values in dictionary.items():
        count[key] = len(values)

我无法确定这个方法是从哪个版本开始提供的,但我认为 .items 方法仅适用于 Python 3。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接