首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:将元组列表重组为字典的聚合列表。

Python:将元组列表重组为字典的聚合列表。
EN

Stack Overflow用户
提问于 2022-09-21 05:07:51
回答 2查看 45关注 0票数 0

我有一些data,它包含在Python的元组列表中,如下所示。

代码语言:javascript
复制
data = [('Test-1', 1, 0.203194), ('Test-1', 2, 0.0143804), ('Test-1', 3, 0.0769853), ('Test-2', 1, 0.00173769), ('Test-3', 1, 0.00842112), ('Test-3', 2, 0.128969), ('Test-4', 1, 0.0481806)]

每个元组都包含test_namesession数和percentile分数的值(按这个顺序)。我需要将这个data重新组合成一个字典列表,其中每个唯一的test_name按如下方式分组:

代码语言:javascript
复制
[
    {
        "test_name": "Test-1",
        "session": [
            {"submission": 1, "percentile": 0.203194},
            {"submission": 2, "percentile": 0.0143804},
            {"submission": 3, "percentile": 0.0769853}
        ]
    },
    {
        "test_name": "Test-2",
        "session": [
            {"submission": 1, "percentile": 0.0}
        ]
    },
    {
        "test_name": "Test-3",
        "session": [
            {"submission": 1, "percentile": 0.0},
            {"submission": 2, "percentile": 0.0}
        ]
    },
    {
        "test_name": "Test-4",
        "session": [
            {"submission": 1, "percentile": 0.0}
        ]
    }
]

我怎么能用Python做这个呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-09-21 05:15:11

在这里,我假设data中相同的data是连续的,所以我可以将它写成一行:

代码语言:javascript
复制
>>> from itertools import groupby
>>> from operator import itemgetter
>>> [{'test_name': test_name,
...   'session': [{'submission': submission, 'percentile': percentile}
...               for _, submission, percentile in group]}
...  for test_name, group in groupby(data, key=itemgetter(0))]
[{'test_name': 'Test-1',
  'session': [{'submission': 1, 'percentile': 0.203194},
              {'submission': 2, 'percentile': 0.0143804},
              {'submission': 3, 'percentile': 0.0769853}]},
 {'test_name': 'Test-2',
  'session': [{'submission': 1, 'percentile': 0.00173769}]},
 {'test_name': 'Test-3',
  'session': [{'submission': 1, 'percentile': 0.00842112},
              {'submission': 2, 'percentile': 0.128969}]},
 {'test_name': 'Test-4',
  'session': [{'submission': 1, 'percentile': 0.0481806}]}]

如果假设不成立:

代码语言:javascript
复制
>>> mp = {}
>>> for test_name, submission, percentile in data:
...    mp.setdefault(test_name, []).append({'submission': submission, 'percentile': percentile})
...
>>> [{'test_name': test_name, 'session': session}
...  for test_name, session in mp.items()]
[{'test_name': 'Test-1',
  'session': [{'submission': 1, 'percentile': 0.203194},
              {'submission': 2, 'percentile': 0.0143804},
              {'submission': 3, 'percentile': 0.0769853}]},
 {'test_name': 'Test-2',
  'session': [{'submission': 1, 'percentile': 0.00173769}]},
 {'test_name': 'Test-3',
  'session': [{'submission': 1, 'percentile': 0.00842112},
              {'submission': 2, 'percentile': 0.128969}]},
 {'test_name': 'Test-4',
  'session': [{'submission': 1, 'percentile': 0.0481806}]}]
票数 4
EN

Stack Overflow用户

发布于 2022-09-21 05:33:26

让我们把这个问题分成几个步骤

这就是我将如何使用简单的原语(循环,列表,字典)。

为每个元组标识“key”dictionary

  • collect

  • ,为以前未见过的密钥准备一个二叉键,如果您以前见过该密钥,则将该“键”更新为“

”列表

代码语言:javascript
复制
intermediate_dict = {} # dictionaries of dictionaries

# 1. For each tuple identify the "key"
for tup in data:
    key, submission, percentile = tup
    if key in intermediate_dict:
        # 3. If you have seen the key before, update the dictionary
        intermediate_dict[key]["session"].append({"submission": submission, "percentile": percentile})

    else:
        # 2. Prepare a dictonary for a key that you haven't seen before
        intermediate_dict[key] = {"session": [{"submission": submission, "percentile": percentile}]}

你的中间白痴可能会像这样

代码语言:javascript
复制
{'Test-1': {'session': [{'submission': 1, 'percentile': 0.203194},
   {'submission': 1, 'percentile': 0.203194},
   {'submission': 2, 'percentile': 0.0143804},
   {'submission': 3, 'percentile': 0.0769853}]},
 'Test-2': {'session': [{'submission': 1, 'percentile': 0.00173769}]},
 'Test-3': {'session': [{'submission': 1, 'percentile': 0.00842112},
   {'submission': 2, 'percentile': 0.128969}]},
 'Test-4': {'session': [{'submission': 1, 'percentile': 0.0481806}]}}

现在,下一步是简单地将字典转换为列表。

代码语言:javascript
复制
return [{"test_name": key, "session": value["session"]} for key, value in intermediate_dict.items()]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73795602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档