【问题标题】:dicts and nested dicts python字典和嵌套字典 python
【发布时间】:2021-05-17 01:56:13
【问题描述】:

我相信尝试以某种简单的方式理解 dicts,但我完全糊涂了。当我运行下面的代码时,它可以很好地填充 dict 并计算单词的出现次数。输出如下:{'gerry': 2, 'babona': 1, 'cheese': 1, 'cherry': 1}

dict = {}

a = ['gerry', 'babona', 'cheese', 'gerry', 'cherry']
b = ['O' ,'O', 'T', 'T', 'T']

for (i,j) in zip(a,b):

  if i not in dict:
    dict[i] = 1
  else:
    dict[i] += 1

但是,如果我尝试运行以下代码,则有一个KeyError: 'gerry',从列表中的第一个值开始,但我不明白为什么。非常感谢您对此的任何帮助!

dict = {}

a = ['gerry', 'babona', 'cheese', 'gerry', 'cherry']
b = ['O' ,'O', 'T', 'T', 'T']

for (i,j) in zip(a,b):

  if i not in dict:
    dict[i][j] = 1
  else:
    dict[i][j] += 1

【问题讨论】:

  • 您究竟希望您的代码做什么? / 期望的输出是什么?
  • dict[i][j] = 1你为什么要这样做?

标签: python dictionary nested


【解决方案1】:

第一个例子可以更简单

from collections import Counter

a = ['gerry', 'babona', 'cheese', 'gerry', 'cherry']

data = Counter(a)

第二次

from collections import defaultdict


a = ['gerry', 'babona', 'cheese', 'gerry', 'cherry']
b = ['O', 'O', 'T', 'T', 'T']

data = defaultdict(lambda: defaultdict(int))

for (i, j) in zip(a, b):
    data[i][j] += 1

顺便说一句,不要为您的变量使用保留名称,例如 dict

【讨论】:

    【解决方案2】:

    当程序到达:dict[i][j] = 1 时,它必须首先执行:dict[i],这正是您在编写第一个 sn-p 时试图避免的。

    您必须进行多阶段测试才能使其正常工作。

    你可以让它像这样工作,但有更简单的方法:

    dct = {}
    
    a = ['gerry', 'babona', 'cheese', 'gerry', 'cherry']
    b = ['O' ,'O', 'T', 'T', 'T']
    
    for (i,j) in zip(a,b):
      if i not in dct:
        dct[i] = {}
        dct[i][j] = 1
      else:
        di = dct[i]
        if j not in di:
            di[j] = 0
        dct[i][j] += 1
    print(dct)
    

    输出:

    {'gerry': {'O': 1, 'T': 1}, 'babona': {'O': 1}, 'cheese': {'T': 1}, 'cherry': {'T': 1}}
    

    【讨论】:

    • 我们可能不得不同意不同意 ;-) 这个来自 elektruveranswer 更简单。
    • 太棒了!这是我正在寻找的输出形式!太感谢了。我也想在不导入任何库的情况下做到这一点,对我来说在这两个级别上都可以工作
    【解决方案3】:
    from collections import Counter
    a = ['gerry', 'babona', 'cheese', 'gerry', 'cherry']
    b = ['O' ,'O', 'T', 'T', 'T']
    print(Counter(a))
    Counter({'gerry': 2, 'babona': 1, 'cheese': 1, 'cherry': 1})
    

    对于第二种情况,您可以使用groupby

    dct = dict((key, tuple(v for (k, v) in pairs)) 
               for (key, pairs) in groupby(sorted(zip(a,b)), lambda pair: pair[0]))
    {k:Counter(v) for k,v in dct.items()}
    {'babona': Counter({'O': 1}), 'cheese': Counter({'T': 1}),'cherry': Counter({'T': 1}), 'gerry': Counter({'O': 1, 'T': 1})}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-31
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多