【问题标题】:counting the number of values in a specific key for a python dictionary计算 python 字典的特定键中的值的数量
【发布时间】:2018-12-09 00:26:07
【问题描述】:

有人可以向我解释这一点,和/或指导我以正确/pythonic 的方式执行此操作吗?

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)}

将项目的计数作为值添加到相应的匹配键中,最终创建这个countsD

{"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()

那么,什么给了?我觉得我错过了一些愚蠢的东西......

感谢您的帮助!

【问题讨论】:

  • 是的。有时,尤其是当您对此不熟悉时,您只是不完全知道要搜索什么来弄清楚自己。最终,我不知道我在这里处理的是一个元组。但是,所有这些回复对我来说都是有帮助的,很好的学习。

标签: python python-2.7 dictionary count tuples


【解决方案1】:

发生这种情况是因为当您保存像 cc 这样只有一个值的值时,它只是保存为 int 并且不再是元组,这意味着它没有 len() 函数。您可以只添加一个检查值的type,例如:

if type(d[key]) == int:
    print(1)
else:
    print(len(d[key]))

这样,您将不会尝试访问 int 的长度属性,也不会出现错误。

【讨论】:

  • 感谢您的帮助!!但我必须说,你不能为一个项目获得 1 的长度,但你可以在一个元组中获得一个没有项目的长度/计数为零,这似乎很奇怪。我不是这方面的专业人士,所以我还不明白:-D
  • 那么你将如何使用 'new_countsD = {k: len(v) for k,v in d.items()}' 为 int vs tuple 实现这个测试???
【解决方案2】:

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

来自tuple's documentation

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

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

【讨论】:

  • 很高兴能提供帮助。如果您认为它是正确的,您可以将这个问题标记为已回答吗?
猜你喜欢
  • 1970-01-01
  • 2016-11-06
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
相关资源
最近更新 更多