【问题标题】:Creating a nested dictionary from tuples that counts the number of occurrences of a tuple item从计算元组项出现次数的元组创建嵌套字典
【发布时间】:2020-03-10 16:57:10
【问题描述】:

我必须对元组列表进行排序并创建一个字典,其中元组中的第一项作为键,嵌套字典将键作为第二项,出现次数作为值。我不知道如何解决这个问题,任何帮助都会很棒。

[('academic', 'hacked'), ('academic', 'lost device'), ('academic', 'lost device'), ('academic', 'lost device'), ('energy', 'inside job'), ('financial', 'hacked')]

期望的输出:

{'academic': {'lost device': 3, 'hacked': 1}, 'energy': {'inside job': 1}, 'financial': {'hacked': 1}}

【问题讨论】:

  • 'financial' 怎么样?你是故意省略的吗?

标签: python python-3.x dictionary nested tuples


【解决方案1】:

这不是pythonic的方式,但至少它可以工作

mylist = [('academic', 'hacked'), ('academic', 'lost device'), ('academic', 'lost device'), ('academic', 'lost device'), ('energy', 'inside job'), ('financial', 'hacked')]        

dict = {}
for el in mylist:
  if not el[0] in dict.keys():
    dict[el[0]] = {}
  if not el[1] in dict[el[0]].keys():
    dict[el[0]][el[1]] = 1
  else:
    dict[el[0]][el[1]] += 1        
print (dict)

结果我得到:

{'academic': {'hacked': 1, 'lost device': 3}, 'energy': {'inside job': 1}, 'financial': {'hacked': 1}}

【讨论】:

    【解决方案2】:

    使用setdefault - 很好:

    x={}
    for a,b in mylist:
       c=x.setdefault(a,{})
       c[b]=c.setdefault(b,0)+1
    print(x)
    

    【讨论】:

      【解决方案3】:

      您可以使用Collections.Counter 在一行中执行此操作,如下所示。这里,vals 是元组列表。

      from collections import Counter
      dict((k[0],{k[1]:v})for k, v in Counter(vals).items())
      

      解决方案

      from collections import Counter
      vals = [('academic', 'hacked'), ('academic', 'lost device'), ('academic', 'lost device'), 
              ('academic', 'lost device'), ('energy', 'inside job'), ('financial', 'hacked')]
      
      output = dict((k[0],{k[1]:v})for k, v in Counter(vals).items())
      print(output)
      

      结果

      {'academic': {'hacked': 1, 'lost device': 3}, 'energy': {'inside job': 1}, 'financial': {'hacked': 1}}
      

      【讨论】:

      • @J_Zolko 这是该问题的单行解决方案。
      猜你喜欢
      • 2021-08-14
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 2021-05-05
      • 2012-08-03
      • 2022-11-30
      • 2016-12-10
      相关资源
      最近更新 更多