【问题标题】:Adding keys to defaultdict(dict)将键添加到 defaultdict(dict)
【发布时间】:2016-04-29 02:06:25
【问题描述】:

我有一个如下所示的默认字典:

my_dict = defaultdict(dict)

将打印出来:

defaultdict(<class 'dict'>, {})

我还有两个列表,如下所示:

list1 =  ["W", "IY", "W"]
list2 =  ["w", "ee", "w"]

我想创建一个如下所示的默认字典:

defaultdict(<class 'dict'>, {'W': {'w': 2}, 'IY': {'ee': 1}}

将字典中的 list1 作为键,将键作为下一个列表,使用单独的字典,将 list2 的实例计为值。

到目前为止,我有这个:

from collections import defaultdict

d = defaultdict(dict)

list1 = ["W", "IY", "W"]
list2 = ["w", "ee", "w"]

for char in list1:
    d[char] += 1

我知道这是不正确的,因为 defaultdict(dict) 不能这样处理。有没有办法我可以做到这一点?任何帮助将不胜感激:)

【问题讨论】:

  • 列表是否总是相同的长度,并且都在 list1 大写和 list2 小写?

标签: python dictionary


【解决方案1】:

这是使用collections.Counter 的解决方案。

import collections
d = collections.defaultdict(collections.Counter)

list1 = ["O", "TH", "O", "O"]
list2 = ["o", "th", "o", "o1"]

for key, value in zip(list1, list2):
    d[key].update([value])

>>> d
defaultdict(<class 'collections.Counter'>, {'TH': Counter({'th': 1}), 'O': Counter({'o': 2, 'o1': 1})})
>>>

虽然这并不严格符合您的要求,但 collections.Counter 继承自 dict,因此它具有 dict 的所有属性

【讨论】:

    【解决方案2】:

    您也可以像这样使用嵌套的 defaultdict 和 zip

    d = defaultdict(lambda: defaultdict(int))
    for k, v in zip(list1, list2):
        d[k][v] += 1
    # d['TH']['th']: 1
    # d['O']['o']: 2
    

    或者,如果你想保留你的数据结构:

    d = defaultdict(dict)
    for k, v in zip(list1, list2):
        d[k][v] = d[k].get(v, 0) + 1  
        # use dict.get(key, default=None) and specify an appropriate default value (0)
    

    使用dict.get(key, default=None) 可以让您访问常见的dict 的键值,就像那些默认字典一样,但是,更新有点笨拙。

    【讨论】:

      【解决方案3】:

      根据对我原始答案的评论进行了编辑。

      您需要将所有可能的音素映射到所有可能的拼写(字素)。

      phonemes = {TH : [th], O : [o], OH : [oh, oo]}
      
      for char in set(list1):
          if char not in d:
              d[char] = {char.lower() : {phone : list2.count(phone) for phone in phonemes[char]}}
      

      【讨论】:

      • 如果您的列表真的很大,您可以添加一个检查以查看 char 是否已经在 d 中。
      【解决方案4】:

      解决方案略有不同:

      import collections
      
      phonemes  = ["W", "IY", "O", "W", "O"]
      graphemes = ["w", "ee", "o", "w", "oh"]
      
      # count all the (phoneme, grapheme) pairs
      counter = collections.Counter(zip(phonemes, graphemes))
      
      # convert to desired data structure
      d = collections.defaultdict(dict)
      for (phoneme, grapheme), count in counter.items():
          d[phoneme][grapheme] = count
      
      print(d)
      

      打印:

      defaultdict(<class 'dict'>, {'W': {'w': 2}, 'O': {'oh': 1, 'o': 1}, 'IY': {'ee': 1}})
      

      【讨论】:

        猜你喜欢
        • 2014-10-21
        • 1970-01-01
        • 2018-08-14
        • 2018-12-06
        • 1970-01-01
        • 1970-01-01
        • 2016-01-21
        • 2012-11-08
        • 2013-12-24
        相关资源
        最近更新 更多