Dictionary:当键是元组时,追加到list的值

2024-06-26 12:58:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将值附加到一个列表中,其中键是一个元组。但我一直得到keyrerror,因为python中的字典不能访问元组作为键

注:我想做的是:

  1. 我有一个json文件。我正在尝试按n项分组,这将是我的字典密钥。然后,我将为tuple的键返回相应的字典列表
  2. 我试着在函数中这样做

请在下面找到我的示例代码:

def group_by_field(data, fields):
    if len(fields) > 1:
        groups = {fields: []}
        for parameter in data:
            for k, v in groups.items():
                for i in fields:
                    if i in k:
                        groups[parameter[k]].append(parameter)
        return groups

以下是我尝试实现该功能的示例:

group_by_field(scripts, ('bnf_name', 'bnf_code'))

其中scripts是一个json文件

以下是json对象scripts的外观:

[{'bnf_code': '0101010G0AAABAB',
  'items': 2,
  'practice': 'N81013',
  'bnf_name': 'Co-Magaldrox_Susp 195mg/220mg/5ml S/F',
  'nic': 5.98,
  'act_cost': 5.56,
  'quantity': 1000},
 {'bnf_code': '0101021B0AAAHAH',
  'items': 1,
  'practice': 'N81013',
  'bnf_name': 'Alginate_Raft-Forming Oral Susp S/F',
  'nic': 1.95,
  'act_cost': 1.82,
  'quantity': 500}]

以下是示例输出的外观:

{('Co-Magaldrox_Susp 195mg/220mg/5ml S/F', '0101010G0AAABAB'): [{'bnf_code': '0101010G0AAABAB',
      'items': 2,
      'practice': 'N81013',
      'bnf_name': 'Co-Magaldrox_Susp 195mg/220mg/5ml S/F',
      'nic': 5.98,
      'act_cost': 5.56,
      'quantity': 1000}],
 ('Alginate_Raft-Forming Oral Susp S/F', '0101021B0AAAHAH'): [{'bnf_code': '0101021B0AAAHAH',
      'items': 1,
      'practice': 'N81013',
      'bnf_name': 'Alginate_Raft-Forming Oral Susp S/F',
      'nic': 1.95,
      'act_cost': 1.82,
      'quantity': 500}]

Tags: nameinfields字典codeitemsactquantity
2条回答

这里有很多问题:

  • 当您尝试将某些内容附加到groups[parameter[k]]时,k具有值('bnf_name', 'bnf_code'),并且显然不在scripts的目录中
  • 即使您解决了前面的问题,parameter[k]也不会存在于groups
  • 您正在迭代期间修改字典groups,这是禁止的

还有一个问题:如果len(fields) <= 1返回什么None?一张空的口述?我建议您应该返回一个空的dict或提出一个错误

试试这个:

def group_by_field(data, fields):
    if len(fields) <= 1:
        return {}

    groups = {}
    for parameter in data:
        key = tuple(parameter[k] for k in fields)
        groups.setdefault(key, []).append(parameter)

    return groups

从字段('bnf_name', 'bnf_code')('Co-Magaldrox_Susp 195mg/220mg/5ml S/F', '0101010G0AAABAB')。。。使用tuple(可散列)。然后将当前dict附加到groups[key]列表中。如果此列表尚不存在,则由setdefault创建

错误是因为您试图使用keu('bnf_name', 'bnf_code')来访问如下对象中的数据,而此元组键不存在

{'bnf_code': '0101010G0AAABAB', 'items': 2, 'practice': 'N81013', 'bnf_name': 'Co-Magaldrox_Susp 195mg/220mg/5ml S/F', 'nic': 5.98, 'act_cost': 5.56, 'quantity': 1000}

您不能使用fields作为键,您希望每个对象的对应值都是键,因此对于每个键,获取值,并将其用作元组作为键:

def build_with_keys(values, fields):
    if len(fields) > 1:
        result = {}
        for value in values:
            key = tuple(value[k] for k in fields)
            result[key] = value
        return result

相关问题 更多 >