如何通过将列表的索引视为键来使包含列表的字典扁平化? [英] How can I flatten dict containing list by considering its index as key?
问题描述
我想把字典弄平.词典中可能包含列表.因此,在扁平化字典中的列表时,应将列表索引作为其键.
I want to flatten the dict. Dictionary may contain lists. So while flattening lists inside dictionary, it should consider list index as its key.
我该怎么做?
我尝试过:
def flatten(d, parent_key='', sep='__'):
items = []
for k, v in d.items():
new_key = parent_key + sep + k if parent_key else k
if isinstance(v, collections.MutableMapping):
items.extend(flatten(v, new_key, sep=sep).items())
else:
items.append((new_key, v))
return dict(items)
这是平整的字典,但忽略了列表.
This is flattening dict but ignoring lists.
我还尝试添加 if isinstance(v,list):
,但是我没有在项目
.
I also tried to add if isinstance(v, list):
, but I am not getting how to append
/ extend
in items
.
data = {
"checksum": "c540fcd985bf88c87e48c2bfa1df5498",
"data": {
"sampleMetrics": {
"name": "DNA Library QC Metrics",
"passQualityControl": "true",
"metrics": [{
"name": "CONTAMINATION_SCORE",
"value": 1302,
"LSL": 0,
"USL": 3106,
"UOM": "NA"
}]
}
}
}
print flatten(data)
我得到的输出:
{
'checksum': 'c540fcd985bf88c87e48c2bfa1df5498',
'data__sampleMetrics__metrics': [{
'LSL': 0,
'USL': 3106,
'name': 'CONTAMINATION_SCORE',
'value': 1302,
'UOM': 'NA'
},{ 'demo': 11}],
'data__sampleMetrics__name': 'DNA Library QC Metrics',
'data__sampleMetrics__passQualityControl': 'true'
}
除了列表元素之外,还有什么其他扁平化的内容.
Which is flattening other thing except list elements.
预期输出:它也应该使列表变平.(通过将列表索引作为键.)
Expected output : It should flatten list as well.(By considering list index as key.)
{
'checksum': 'c540fcd985bf88c87e48c2bfa1df5498',
'data__sampleMetrics__metrics__0__LSL': 0,
'data__sampleMetrics__metrics__0__USL': 3106,
'data__sampleMetrics__metrics__0__name': 'CONTAMINATION_SCORE',
'data__sampleMetrics__metrics__0__value': 1302,
'data__sampleMetrics__metrics__0__UOM': 'NA',
'data__sampleMetrics__metrics__1__demo': 11,
'data__sampleMetrics__name': 'DNA Library QC Metrics',
'data__sampleMetrics__passQualityControl': 'true'
}
如何通过将其索引视为键来拼合包含列表的字典?
推荐答案
You need to check for lists as well - they are not MutableMapings - hence they currently fall under your else:
part and get added as is:
import collections
from itertools import chain
def flatten(d, parent_key='', sep='__'):
items = []
for k, v in d.items():
new_key = parent_key + sep + k if parent_key else k
if isinstance(v, collections.MutableMapping):
items.extend(flatten(v, new_key, sep=sep).items())
elif isinstance(v, list):
for idx, value in enumerate(v):
items.extend(flatten(value, new_key + sep + str(idx), sep).items())
else:
items.append((new_key, v))
return dict(items)
data = {
"checksum": "c540fcd985bf88c87e48c2bfa1df5498",
"data": {
"sampleMetrics": {
"name": "DNA Library QC Metrics",
"passQualityControl": "true",
"metrics": [{
"name": "CONTAMINATION_SCORE",
"value": 1302,
"LSL": 0,
"USL": 3106,
"UOM": "NA"
},{ 'demo': 11}]
}
}
}
print flatten(data)
输出:
{'data__sampleMetrics__metrics__0__LSL': 0,
'checksum': 'c540fcd985bf88c87e48c2bfa1df5498',
'data__sampleMetrics__metrics__0__name': 'CONTAMINATION_SCORE',
'data__sampleMetrics__metrics__1__demo': 11,
'data__sampleMetrics__metrics__0__UOM': 'NA',
'data__sampleMetrics__metrics__0__USL': 3106,
'data__sampleMetrics__metrics__0__value': 1302,
'data__sampleMetrics__passQualityControl': 'true',
'data__sampleMetrics__name': 'DNA Library QC Metrics'}
要获取排序的"输出,您需要在python 2.x中使用OrderedDict:
To get a "sorted" output you would need to use an OrderedDict in python 2.x:
从集合中导入OrderedDict
from collections import OrderedDict
data = OrderedDict(sorted(flatten(data).items()))
print data
输出:
OrderedDict([('checksum', 'c540fcd985bf88c87e48c2bfa1df5498'),
('data__sampleMetrics__metrics__0__LSL', 0),
('data__sampleMetrics__metrics__0__UOM', 'NA'),
('data__sampleMetrics__metrics__0__USL', 3106),
('data__sampleMetrics__metrics__0__name', 'CONTAMINATION_SCORE'),
('data__sampleMetrics__metrics__0__value', 1302),
('data__sampleMetrics__metrics__1__demo', 11),
('data__sampleMetrics__name', 'DNA Library QC Metrics'),
('data__sampleMetrics__passQualityControl', 'true')])
这篇关于如何通过将列表的索引视为键来使包含列表的字典扁平化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!