Skip to main content
 首页 » 编程设计

python之是否有像 collections.Counter() 这样的 Python 标准库类,但以列表作为值

2025年05月04日49www_RR

collections.Counter() 类非常方便。只需要几行代码就可以实现这样的功能;但当您记得使用它时,它位于标准库中,这很好。

事实上,我经常重写那三四行代码而不是使用它们,这让我感到非常尴尬。

但我经常需要做一些非常相似的事情……将值累积到字典中的键中。但是,不同之处在于我想将值累积为列表,而不是仅仅计算它们。例如,最近我想处理一大堆 LDAP DN,我想写这样的东西:

#!python 
f = 'o=Foo,ou=bar,cn=this,dc=sub,dc=org,dc=somewhere,dc=not' 
d = dict() 
for i in f.split(','): 
    k, v = i.split('=') 
    if k not in d: 
        d[k] = list() 
    d[k].append(v) 

(这是为了让我能够轻松地生成从搜索返回的所有项目的列表,它远没有 DN 规范那么冗长:Foo: bar: this@sub.org.somewhwere.not ,但这或多或少与这个问题无关)。

标准库中是否已经存在某种“累加器”类?有点像“更新”或计数器但将值附加到

请您参考如下方法:

您可以使用 collections.defaultdict , 像这样

d = collections.defaultdict(list) 
for i in f.split(','): 
    k, v = i.split('=') 
    d[k].append(v) 

但在这种情况下,您可以使用 dict.setdefault , 像这样

>>> d = {} 
>>> for i in f.split(','): 
...     k, v = i.split('=') 
...     d.setdefault(k, []).append(v) 
...  
>>> d 
{'cn': ['this'], 'dc': ['sub', 'org', 'somewhere', 'not'], 'o': ['Foo'], 'ou': ['bar']}