gpt4 book ai didi

python - 如何通过将其索引视为键来展平包含列表的字典?

转载 作者:太空宇宙 更新时间:2023-11-04 09:32:14 25 4
gpt4 key购买 nike

我想压扁字典。字典可能包含列表。因此,在字典中展开列表时,应将列表索引视为其键。

我怎样才能做同样的事情?

我试过:

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)

这是扁平化字典但忽略列表。

我还尝试添加 if isinstance(v, list): , 但我不知道如何 append/extenditems .

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

除了列表元素之外,它会展平其他东西。

预期输出:它也应该展平列表。(通过将列表索引视为键。)

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

如何通过将其索引作为键来展平包含列表的字典?

最佳答案

您还需要检查列表 - 它们不是 MutableMapings - 因此它们目前属于您的 else: 部分并按原样添加:

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:

从集合中导入 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')])

关于python - 如何通过将其索引视为键来展平包含列表的字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55294445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com