我有一個具有以下形狀的字典列表:
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'
您可以將其展平,例如:
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] 删除。
我来说两句