【问题标题】:Finding the max repeated value in dictionary keys python在字典键python中查找最大重复值
【发布时间】:2018-01-12 07:14:45
【问题描述】:

我在python中有字典

d = {(2,4):40,(1,2,4):8}

在这个字典中,键是元组, 值是元组中每个元素的计数

我需要再输出 1 个字典 所有元组中的值的总数

out={2:48,4:48,1:8}

我给出的例子是小字典,但我的字典很大,所以时间复杂度起着关键作用 有人可以帮帮我吗?

【问题讨论】:

  • 您想找到数量最多的那些吗?喜欢 4 或 2,因为他们都有 48?

标签: python dictionary


【解决方案1】:

您可以一次完成此操作,只需遍历键并添加相应的值。您可以使用 collections.Counter 或任何您喜欢的类似 dict/dict 的容器:

>>> origin = {(2,4):40,(1,2,4):8}
>>> from collections import Counter
>>> counts = Counter()
>>> for k, v in origin.items(): # python 2 use .iteritems()
...     for x in k:
...         counts[x] += v
...
>>> counts
Counter({2: 48, 4: 48, 1: 8})

【讨论】:

  • 嗯。您使用Counter 而不使用它的计数能力。它没有普通的dict 做不到(或defaultdict(int))。
  • @schwobaseggl 我当然会使用它的计数能力。
  • 不是任何其他 dict 都无法做到的。
  • @schwobaseggl 这样吗?这是最直接的方式。它速度快,内存效率高。
  • 我没有说这是错误的 ;) 我只是认为这是向某人展示 Counter 的坏例子,其固有的优势是它的高性能构造函数可以传递一个可迭代的,但更好有机会将 OP 介绍给 defaultdict。
【解决方案2】:

可以利用多个Counters 的功能轻松相加以创建一些简洁的单行,但它们的性能无法与juanpa's explicit loop approach 竞争(原始dict 的计时):

from collections import Counter
from operator import add
from functools import reduce

# 1
out = sum((Counter({x: v for x in k}) for k, v in d.items()), Counter())
# timeit: 16.2

# 2
out = reduce(add, (Counter({x: v for x in k}) for k, v in d.items()))
# timeit: 10.8

# 3
# juanpa's approach
# timeit: 3.7

【讨论】:

    【解决方案3】:
    Dict = {(2,4):40,(1,2,4):8}    
    Out={}
    
    for k,v in Dict.items():
        for i in k:
            if i in Out:
                Out[i] += v
            else:
                Out[i] = v
    
    print(Out)
    
    {2: 48, 4: 48, 1: 8}
    

    【讨论】:

      猜你喜欢
      • 2012-09-14
      • 2020-05-03
      • 2021-04-25
      • 2018-09-27
      • 1970-01-01
      • 2016-01-19
      • 2021-02-20
      • 2023-03-25
      • 2019-06-07
      相关资源
      最近更新 更多