gpt4 book ai didi

python - 将所有值的 Python Dict 扁平化为 True/False

转载 作者:太空宇宙 更新时间:2023-11-03 15:10:04 24 4
gpt4 key购买 nike

假设我有一个 Python 字典,它可能包含嵌套到任意级别的其他字典。此外,一些键引用 bool 值选择,而其他键则不引用。像这样:

{'Key1': 'none',
'Key2': {'Key2a': True, 'Key2b': False},
'Key3': {'Key3a': {'Key3a1': 'some', 'Key3a2': 'many'}, 'Key3b': True}}

我想做的是把它变成这样:

{'Key1_none': 1,
'Key2_Key2a': 1,
'Key2_Key2b': 0,
'Key3_Key3a_Key3a1_some': 1,
'Key3_Key3a_Key3a2_many': 1,
'Key3b': 1}

现在只有 dict 变平了,所有的键现在都有 bool 值答案。 This solution是一个很好的开始,但我对 Python 不是很熟悉。我链接到的解决方案处理了大多数情况,但它并没有在所有情况下都深入到值(value)级别。对于上面的示例,它会将第一部分保留为:

{'Key1': 'none',
'Key2_Key2a': 1,
'Key2_Key2b': 0,
...}

显然用 1/0 替换 True/False 是微不足道的。我的问题更多是关于当键的值不是 True 或 False 时如何扁平化到附加级别。

最佳答案

我认为这个递归函数应该这样做:

def flatten(d, prefix=''):
prefix = prefix + '_' if prefix else ''
new = {}
for k, v in d.items():
if isinstance(v, bool):
new[prefix + k] = int(v)
elif isinstance(v, dict):
new.update(flatten(v, prefix=prefix + k))
elif isinstance(v, basestring): # python3 -- str
new[prefix + k + '_' + v] = 1
else:
raise TypeError('Unknown item type.')
return new

如果值是一个字典并且键的“前缀”被附加到嵌套前缀的任何前一层,就会发生递归。

当然,您可以通过在 isinstance 检查中使用适当的 ABC 来做得更好……例如

bool -> numbers.Integral
dict -> collections.Mapping

关于python - 将所有值的 Python Dict 扁平化为 True/False,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27992500/

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