18

Python 3.3,具有这种形式的键值对的字典。

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

这些值是可变长度的列表,我需要遍历列表项。这有效:

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

但它很丑。必须有一种更 Pythonic 的方式,但我似乎找不到它。

len(d.values()) 

产生 1。它是 1 个列表 (DUH)。从此处尝试使用 Counter会给出“不可散列类型”错误。

4

5 回答 5

49

每个字典值的用途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

ACounter在这里对您没有多大帮助,您不是在为每个条目创建计数,而是在计算所有值的总长度。

于 2013-05-31T19:57:30.120 回答
16
>>> d = {'T1': ['eggs', 'bacon', 'sausage'], 'T2': ['spam', 'ham', 'monty', 'python']}
>>> sum(map(len, d.values()))
7
于 2013-05-31T20:01:18.680 回答
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)
于 2017-06-08T00:05:30.040 回答
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))
于 2020-12-16T07:06:23.640 回答
-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 中可用。

于 2016-12-30T09:56:02.200 回答