python中一个字典的元素在另一个字典中出现的计数器

python中一个字典的元素在另一个字典中出现的计数器,python,dictionary,Python,Dictionary,我有一个嵌套字典列表,其中都有我感兴趣的另一个字典列表。也就是说,如果我有: list_of_dicts[0]['data_i_need'] 它包含以下词典: [ { 'key1': ['item1', 'item2', 'item3'], 'details': 'details' }, { 'key2': ['item2', 'item4'], 'details': 'other details' } ] 我有另一本大词典(d2),其结构如下

我有一个嵌套字典列表,其中都有我感兴趣的另一个字典列表。也就是说,如果我有:

list_of_dicts[0]['data_i_need']
它包含以下词典:

[
  {
    'key1': ['item1', 'item2', 'item3'],
    'details': 'details'
  },
  {
    'key2': ['item2', 'item4'],
    'details': 'other details'
  }
]
我有另一本大词典(d2),其结构如下:

{
“项目1”:{
“详细信息”:[“详细信息1”、“详细信息2”、“详细信息2],
“类”:[“类2”],
},
“项目2”:{
'详细信息':['detail1'],
“类”:[“类1”、“类2”],
},
}
我想在
目录列表
中的每一本词典中添加另一本词典,如下所示:

{'class1': 2, 'class2': 3}
也就是说,如果一个项目对应于一个类别,并且该类别在目录[0]['data\u I\u need']的
列表中,我需要对其进行计数。我想循环浏览字典列表中的每一本字典

我已经尝试了很多东西,其中有一些像下面,但我现在觉得卡住了

import Counter

for l in list_of_dict:
   for d in l['data_i_need']:
    Counter(d2[d]["classes"])

您应该始终为要实现的代码定义完整的输入和完整的输出;这个问题并没有具体说明你想要的确切输入和确切输出,它试图模糊地解释它。处理提出的问题真的很难:你应该提供语义值,你应该提供准确的值。“类”没有上下文就没有意义;“item1”和“key1”没有任何含义。“细节”也意味着自由。提供细节可以简化问题的阅读,并允许读者提供帮助,而不仅仅是“我如何实现这个谜题”:你想要的是好的答案和解决方案,而不是谜题的答案

如果我理解正确,您希望迭代第一个列表中的所有词典,并根据其他一些条件更新此dict。让我们通过将两者传递给一个新函数来区分这一点——doable,因为python dict是通过引用传递的:

目录列表中的d的
:
添加类别计数(d,itemInfo)
(我将
d2
重命名为
itemInfo
,因为它至少有更多的语义信息。)

我假设
d
将是一本由以下内容组成的词典:

{
  'data_i_need': [
    {
      'key1': ['item1', 'item2', 'item3'],
      'details': 'some irrelevant details',
    },
    {
       'key2': [...],
       # more?
    }
  ]
}
我很困惑您是否有
key1
key2
。我们是否可以假设它只是
?您应该将键中的
key1
key2
转换为键名下的值,例如:

{
'name':'key1',
'items':['item1','item2']
“细节”:“一些不相关的细节”
}
问题是,如果输入不是这样构造的,您如何知道这些神奇的键名是哪个
key1
key2
?您需要一个其他常量键的允许列表,如
详细信息
,然后尝试猜测其他键中的哪个键是
key1
,您将忽略该列表:

数据字典(d)的定义名称: #注意:未测试的代码。 允许_列表=['details'] 所有钥匙=d.钥匙() 未知_键=[k表示所有_键中的k,如果k不在允许_列表中] 如果len(未知_键)==1: 返回未知的_键[0] #如果是0或大于1,我们无法猜测,请放弃 引发异常('无效数据:'+str(d))
这很难看,如果您有多个“非常量”键,它将(有意)中断

现在让我们试着了解一下
添加类计数()应该做什么。似乎要指定列表中有多少项是某个类的一部分

让我们看看
add_class_counts()
需要检查传递的dict中的每个项目:

def add_class_counts(d, itemInfo):
  # expected input:
  # d = {
  #   'name': 'key1',
  #   'items': ['item1', 'item2'],
  # }

  class_counts = {}
  for itm in d['items']:
    class_list = classes_for_item(itmName, itemInfo):
    # TODO: count it somehow
我们如何知道哪些类是项目的一部分?很明显,真的:

def class_列表(itmName,itemInfo):
#这应该返回['class1','class2']
返回itemInfo[itemName]['classes']
我们怎么计算这个

def添加类计数(d,itemInfo):
类_计数={}
对于d['items']中的itm:
class\u list=项目的class\u(itmName,itemInfo):
对于类列表中的类名称:
尝试:
类计数[类名称]+=1
除了:#TODO:限制为“找不到密钥”异常,我现在记不起来了
类计数[类名称]=0
#我们已经数完了。
#使用计数更新现有字典。
d['class_counts']=class_counts
注意:该代码未经测试,它正在做一些奇怪的事情(可能您希望返回
class_counts
,然后更新
d
?)。但它可能会给你一个基本的想法


当然,如果它没有实现您所期望的,那么您真的需要编写一个更具体、语义更丰富的解释,说明输入是什么以及您希望作为输出接收什么。任何真正想帮助你的人都会想理解你为什么要做你想做的事情。

当你说“上面这行的输出看起来像这样”时,你是说你的字典是一个类似[{'data_i_u'need':[{'key1':['item1','item2','item3'],…},…]的四重嵌套循环吗?@Kenta还有更多的筑巢,但为了简单起见,我们可以说是的,四重筑巢得到了。另外,您是否可以添加到“如果类对应的项在目录[0]['data\u i\u need']的列表中,我需要计算它。”语句?我不确定你到底想在这里实现什么。