将带有列表值的 OrderedDict 扩展为字典列表

发布于 2025-01-13 16:40:53 字数 494 浏览 9 评论 0原文

我有一个带有值列表的 OrderedDict:

OrderedDict([('key1', ['value1', 'value2']),
             ('key2',
              [[{'name': ['A', 'B'], 'amount': ['1', '2']}],
               [{'name': ['C', 'D'], 'amount': ['3', '4']}]])])

我想将其转换为字典列表,其中内部字典值中的列表在列表中的各个字典中扩展:

[{'key1': 'value1',
  'key2': [{'name': 'A', 'amount': 1}, {'name': 'B', 'amount': 2}]},
 {'key1': 'value2',
  'key2': [{'name': 'C', 'amount': 3}, {'name': 'D', 'amount': 4}]}]

I have an OrderedDict with a list of values:

OrderedDict([('key1', ['value1', 'value2']),
             ('key2',
              [[{'name': ['A', 'B'], 'amount': ['1', '2']}],
               [{'name': ['C', 'D'], 'amount': ['3', '4']}]])])

I'd like to transform this to a list of dictionaries where the lists in the values of the inner dictionaries expanded across separate dictionaries in a list:

[{'key1': 'value1',
  'key2': [{'name': 'A', 'amount': 1}, {'name': 'B', 'amount': 2}]},
 {'key1': 'value2',
  'key2': [{'name': 'C', 'amount': 3}, {'name': 'D', 'amount': 4}]}]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

做个少女永远怀春 2025-01-20 16:40:53

我们可以使用 zip 一起遍历“key1”和“key2”下的值,并在迭代时附加到输出列表。此外,内部字典的值也必须一起遍历,因此我们解压 lst[0] 的值并使用 zip 来构造内部字典:

out = []
for v, lst in zip(data['key1'], data['key2']):
    d = {'key1': v, 'key2': []}
    for tpl in zip(*lst[0].values()):
        mid = {key: val for key, val in zip(lst[0], tpl)}
        d['key2'].append(mid)
    out.append(d)

与嵌套理解相同的代码:

out = [{'key1': v, 'key2': [{key: val for key, val in zip(lst[0], tpl)} for tpl in zip(*lst[0].values())]} for v, lst in zip(data['key1'], data['key2'])]

输出:

[{'key1': 'value1',
  'key2': [{'name': 'A', 'amount': '1'}, {'name': 'B', 'amount': '2'}]},
 {'key1': 'value2',
  'key2': [{'name': 'C', 'amount': '3'}, {'name': 'D', 'amount': '4'}]}]

We could use zip to traverse values under both "key1" and "key2" together and append to an output list as we iterate. Moreover, the values of the inner dict have to be traversed together as well, so we unpack the values of lst[0] and use zip yet to construct the inner dictionary:

out = []
for v, lst in zip(data['key1'], data['key2']):
    d = {'key1': v, 'key2': []}
    for tpl in zip(*lst[0].values()):
        mid = {key: val for key, val in zip(lst[0], tpl)}
        d['key2'].append(mid)
    out.append(d)

The same code as a nested comprehension:

out = [{'key1': v, 'key2': [{key: val for key, val in zip(lst[0], tpl)} for tpl in zip(*lst[0].values())]} for v, lst in zip(data['key1'], data['key2'])]

Output:

[{'key1': 'value1',
  'key2': [{'name': 'A', 'amount': '1'}, {'name': 'B', 'amount': '2'}]},
 {'key1': 'value2',
  'key2': [{'name': 'C', 'amount': '3'}, {'name': 'D', 'amount': '4'}]}]
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文