【问题标题】:Pythonically adding keys to a dict以 Python 方式将键添加到 dict
【发布时间】:2018-12-06 14:09:08
【问题描述】:

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

d = OrderedDict()
for i, v in enumerate(s):
   if v not in d:
      d[v] = 1
   else:
      d[v] += 1

如何使用 setdefault 而不是 collections. Counter 使用 1 行代码执行此操作 就像如果这是一个列表,那么我可以做到,

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

有没有办法用整数加法做类似的事情。

【问题讨论】:

  • collections.Counter 有什么问题?还有collections.defaultdict?
  • 什么是s?你的意思是enumerate(d)
  • 使用defaultdict怎么样?
  • 您不能使用setdefault() 执行此操作,因为它返回已设置的对象,并且由于整数是不可变的,因此更改它们不会更改原始对象,而是会创建一个新对象。现在一种解决方法是使用 @J. Snow 提议或创建自己的字典,其性能类似于 Orderdictdefaultdict

标签: python python-3.x dictionary counter ordereddictionary


【解决方案1】:

只需使用有序柜台即可。如果你乐意导入OrderedDict,我认为你没有理由避免Counter

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+ 中,您可以只使用 Counter,因为字典是按插入顺序排列的。

【讨论】:

    【解决方案2】:

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

    import itertools
    
    s = [1, 2, 3, 4, 5, 6, 7, 12, 4, 7, 3]
    
    d = {key: len(list(items)) for key, items in itertools.groupby(sorted(s))}
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 2019-09-27
        • 1970-01-01
        • 2023-01-26
        相关资源
        最近更新 更多