【问题标题】:Creating a "compressed" dictionary创建“压缩”字典
【发布时间】:2019-01-07 21:48:19
【问题描述】:

我有一个 python 字典,我想根据键压缩成不同的字典:

{'field1_0': 'FieldName1', 'field2_0': 'DataType1', 
    'field1_1': 'FieldName 2', 'field2_1': 'DataType2'}

在这篇文章中,我的键是自动表单字段名称,它们按“_”后面提供的数字分组:field1_0field2_0field1_1field2_1 分组由于尾随编号而被分组。

我想将这些分组元素组合起来,并将它们压缩成键值对的字典,其中分组项的每个值都在新字典中。

以上面的dict为例。我想要一个看起来像这样的字典:

{'FieldName1': 'DataType1', 'FieldName2': 'DataType2'}

关于我正在做的事情:我有一些动态 Django 表单,允许用户在我的项目中创建自定义报告。为此,我有 1 个表单,允许他们输入所需字段数的数字。提交此表单时,动态表单会为每个输入的元素数量创建 2 个字段(1 个用于字段名称,1 个用于数据类型,即 'field1_{x}': 'field name''field2_{x}':'datatype')。我将提交这个创建我们正在讨论的 dict 的提交,并将其传递到一个不同的动态表单中,该表单根据字段名称和数据类型创建字段,然后中提琴你已经有了可以基于 3rd 方声明创建的自定义表单。

【问题讨论】:

  • 我认为这个想法是fieldx_0 是一个值为fieldx_1 的键,用于x = 1, 2, ...
  • 知道了,谢谢,但仍然认为你有一个错误的' '
  • 所以你在第二个数字上分组;关注_。拆分您的键,将最后一部分用作新字典中的键来跟踪组,使值成为键和值的两个元素的列表,根据键中的第一个数字分配给该列表(1 - > 索引 0,2 -> 索引 1,所以使用 int() 并减去 1)。
  • 或者,使用像 WTForms 这样不错的表单抽象库,让它为您处理请求数据和 Python 数据模型之间的映射。

标签: python dictionary dictionary-comprehension


【解决方案1】:

在字段被连续编号并且总是正确配对的假设下,您可以使用简单的dict理解:

d = {'field1_0': 'FieldName1', 'field2_0': 'DataType1', 
     'field1_1': 'FieldName 2', 'field2_1': 'DataType2'}

new_d = {d[f'field1_{x}']: d[f'field2_{x}'] for x in range(len(d)//2)}

结果:

{'FieldName1': 'DataType1', 'FieldName2': 'DataType2'}

【讨论】:

  • 是我自己还是这段代码有语法错误
  • @Feelsbadman:我没有发现明显的语法错误。您必须更加明确(我修复了一个小的除法问题,代码在 Python 3.6 及更高版本中运行良好)。
  • 我使用 Python 3.7 的 f-strings 来简化代码。根据您的 Python 版本调整字符串格式。
  • @chepner:Python 3.6 引入了f-strings。
  • 这正是我所需要的,谢谢你们。不理解我的反对意见,但这是我问题的正确答案,所以我将把它作为一个已发布的问题作为答案。
猜你喜欢
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 2013-04-21
  • 1970-01-01
相关资源
最近更新 更多