计算python字典的特定键中的值数

时间:2018-06-29 19:08:03

标签: python python-2.7 dictionary count tuples

有人可以向我解释一下,和/或指导我这样做的正确/ Python方式吗?

Python 2.7。

最终,我试图遍历字典的计数D:

countsD = {"aa": None, "bb": None, "cc": None, "dd": None} 

并针对相应字典d中的匹配项:

d = {"aa": (5689, 34, 44, 77, 88, 321), "bb": (33, 6742, 89744), "cc": (45, 98), "dd": (1, 33)}

将项目计数作为值添加到相应的匹配键中,以最终创建此计数D

{"aa": 6, "bb": 3, "cc": 2, "dd": 2}

如果我通过上面的方法这样做

> d = {"aa": (5689, 34, 44, 77, 88, 321), "bb": (33, 6742, 89744), "cc": (45, 98), "dd": (1, 33)}

> for key in d:

>>     print(key)
>>     print(len(d[key]))

这是我想要的

aa
6
cc
2
dd
2
bb
3

但是,如果某个键的值之一仅包含1个值(完全可能),例如(请参见“ cc”):

d = {"aa": (5689, 34, 44, 77, 88, 321), "bb": (33, 6742, 89744), "cc": (45), "dd": (1, 33)}

然后运行相同的for循环,我在“ cc”键上收到错误:

aa
6
cc
Traceback (most recent call last):
  File "<interactive input>", line 3, in <module>
TypeError: object of type 'int' has no len()

但是,如果我使“ cc”键的值为空(),那么一切都很好。

d = {"aa": (5689, 34, 44, 77, 88, 321), "bb": (33, 6742, 89744), "cc": (), "dd": (1, 33)}

>>> d = {"aa": (5689, 34, 44, 77, 88, 321), "bb": (33, 6742, 89744), "cc": (), "dd": (1, 33)}
>>> for key in d:
...     print(key)
...     print(len(d[key]))
... 
aa
6
cc
0
dd
2
bb
3

在刚才输入该帖子的标题时,我被引到Count number of values in dictionary for each key来回答。太好了,一行!但是同样,对于只有一个值的键,它会失败。这个好:

>>> d = {"aa": (5689, 34, 44, 77, 88, 321), "bb": (33, 6742, 89744), "cc": (), "dd": (1, 33)}
>>> new_countsD = {k: len(v) for k,v in d.items()}
>>> new_countsD
{'aa': 6, 'bb': 3, 'cc': 0, 'dd': 2}

不是,请参见键“ cc”

>>> d = {"aa": (5689, 34, 44, 77, 88, 321), "bb": (33, 6742, 89744), "cc": (111), "dd": (1, 33)}
>>> new_countsD = {k: len(v) for k,v in d.items()}
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "<interactive input>", line 1, in <dictcomp>
TypeError: object of type 'int' has no len()

那么,有什么作用?我觉得我想念一些愚蠢的东西...

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

在python中,单项元组(称为单例)写为(value,),因此输入中的(111)应该写为(111,);否则将被视为111的整数。

来自tuple's documentation

  

一个特殊的问题是包含0或1的元组的构造   项目:语法有一些额外的怪癖来适应这些情况。空的   元组由一对空括号构成;与元组   一项是通过在值后面加上逗号来构造的(不是   足以将单个值括在括号中)。丑陋的,但是   有效。

>>> empty = ()
>>> singleton = 'hello',    # <-- note trailing comma
>>> len(empty)
0
>>> len(singleton)
1
>>> singleton
('hello',)

答案 1 :(得分:1)

之所以发生这种情况,是因为当您保存一个只有一个值的cc之类的值时,它只是另存为int并且不再是元组,这意味着它没有{{ 1}}函数。您只需添加对值len()的检查,例如:

type

这样,您将不会尝试访问if type(d[key]) == int: print(1) else: print(len(d[key])) 的length属性,也不会收到错误消息。