簡體   English   中英

Python:將元組列表重塑為字典的聚合列表

[英]Python: Reshape a list of tuples into an aggregated list of dictionaries

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

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都按如下方式分組:

[
    {
        "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 中做到這一點?

這里我假設data中相同的test_name是連續的,這樣我就可以寫成一行:

>>> 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}]}]

如果假設不成立:

>>> 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}]}]

讓我們將問題分解為步驟

這就是我使用簡單原語(循環、列表、字典)的方式

  1. 為每個元組確定“鍵”
  2. 為你以前沒見過的鍵准備一個字典
  3. 如果您以前見過密鑰,請更新字典
  4. 將所有字典收集到一個列表中
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}]}

您的中間字典可能看起來像這樣

{'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}]}}

現在下一步是簡單地將字典轉換為列表

return [{"test_name": key, "session": value["session"]} for key, value in intermediate_dict.items()]
    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM