用pythonical方法向dict添加键

用pythonical方法向dict添加键,python,python-3.x,dictionary,counter,ordereddictionary,Python,Python 3.x,Dictionary,Counter,Ordereddictionary,我想添加一个计数为1的键,并在每次增加时递增,这是一个经典的操作。这是我的常规代码 d = OrderedDict() for i, v in enumerate(s): if v not in d: d[v] = 1 else: d[v] += 1 如何使用setdefault而不是集合的一行代码来实现这一点。计数器 如果这是一张单子我就可以 d.setdefault(v,[]).append() 整数加法也有类似的方法。您可以这样做: d[v] = d.

我想添加一个计数为1的键,并在每次增加时递增,这是一个经典的操作。这是我的常规代码

d = OrderedDict()
for i, v in enumerate(s):
   if v not in d:
      d[v] = 1
   else:
      d[v] += 1
如何使用
setdefault
而不是
集合的一行代码来实现这一点。计数器
如果这是一张单子我就可以

d.setdefault(v,[]).append()


整数加法也有类似的方法。

您可以这样做:

d[v] = d.get(v, 0) + 1

如果我们想使用oneliner并被允许使用:


只要使用一个有序的计数器。如果您愿意导入
OrderedDict
,在我看来,您没有理由避免使用
计数器

from collections import OrderedDict, Counter

class OrderedCounter(Counter, OrderedDict):
    pass

s = [3, 1, 3, 1, 2, 3, 4]

d = OrderedCounter(s)

print(d)

OrderedCounter({3: 3, 1: 2, 2: 1, 4: 1})

注意:在Python 3.7+中,您可以只使用
计数器
,因为字典是按插入顺序排列的。

集合有什么问题。计数器
?和
collections.defaultdict
?什么是
s
?您的意思是
enumerate(d)
?使用defaultdict如何?使用
setdefault()
无法执行此操作,因为它返回已设置的对象,并且由于整数是不可变的,更改它们不会更改原始对象,而是会创建一个新对象。现在一个解决办法是使用@J.Snow提出的方法,或者创建自己的字典,执行类似于
Orderdict
defaultdict
from collections import OrderedDict, Counter

class OrderedCounter(Counter, OrderedDict):
    pass

s = [3, 1, 3, 1, 2, 3, 4]

d = OrderedCounter(s)

print(d)

OrderedCounter({3: 3, 1: 2, 2: 1, 4: 1})