在 Python 中展平字典列表

阿爾特姆

我有一個具有以下形狀的字典列表:

x = [{'website_ctr': [{'action_type': 'link_click', 'value': '0.481928'}],
  'campaign_id': 'x',
  'date_start': '2021-11-01',
  'date_stop': '2021-11-01',
  'account_id': 'y'},
 {'website_ctr': [{'action_type': 'link_click', 'value': '0.40568'}],
  'campaign_id': 'x',
  'date_start': '2021-11-01',
  'date_stop': '2021-11-01',
  'account_id': 'y'},
 {'website_ctr': [{'action_type': 'link_click', 'value': '0.711382'}],
  'campaign_id': 'x',
  'date_start': '2021-11-01',
  'date_stop': '2021-11-01',
  'account_id': 'y'}]

我正在嘗試壓平字典,以便列表中的每個對像看起來像這樣

{'website_ctr-0-action_type': 'link_click',
 'website_ctr-0-value': '0.481928',
 'campaign_id': 'x',
 'date_start': '2021-11-01',
 'date_stop': '2021-11-01',
 'account_id': 'y'}

我找到了以下代碼片段,並嘗試將其調整為適合我的情況,但是我不斷收到AttributeError: 'str' object has no attribute 'items'錯誤消息,我認為錯誤來自我的第一個循環for dictionary in datalist

import collections

def flatten(datalist, parent_key=False, separator='-'):   
    items = []
    for dictionary in datalist:
        for key, value in dictionary.items():
            new_key = str(parent_key) + separator + key if parent_key else key
            if isinstance(value, collections.MutableMapping):
                items.extend(flatten(value, new_key, separator).items())
            elif isinstance(value, list):
                for k, v in enumerate(value):
                    items.extend(flatten({str(k): v}, new_key).items())
            else:
                items.append((new_key, value))
    return dict(items)

問題:我做錯了什麼?

完整追溯:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
c:\Users\avk\facebookdata\ReadData\fb_credentials.py in <module>
----> 1 flatten(x)

c:\Users\avk\facebookdata\ReadData\fb_credentials.py in flatten(datalist, parent_key, separator)
    102             elif isinstance(value, list):
    103                 for k, v in enumerate(value):
--> 104                     items.extend(flatten({str(k): v}, new_key).items())
    105             else:
    106                 items.append((new_key, value))

c:\Users\avk\facebookdata\ReadData\fb_credentials.py in flatten(datalist, parent_key, separator)
     96     items = []
     97     for dictionary in datalist:
---> 98         for key, value in dictionary.items():
     99             new_key = str(parent_key) + separator + key if parent_key else key
    100             if isinstance(value, collections.MutableMapping):

AttributeError: 'str' object has no attribute 'items'
用戶2390182

您可以將其展平,例如:

def flatten(obj, pre="", sep="-"):
    if isinstance(obj, dict):
        items = obj.items()
    elif isinstance(obj, (list, tuple)):
        items = enumerate(obj)
    else:
        return {pre: obj}
    result = {}
    for k, v in items:
        result.update(flatten(v, f"{pre}{sep}{k}".strip(sep), sep))
    return result

flatten(x[0])
# {'account_id': 'y',
#  'campaign_id': 'x',
#  'date_start': '2021-11-01',
#  'date_stop': '2021-11-01',
#  'website_ctr-0-action_type': 'link_click',
#  'website_ctr-0-value': '0.481928'}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章