Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多级dict到字符串_Python_String_Dictionary - Fatal编程技术网

Python多级dict到字符串

Python多级dict到字符串,python,string,dictionary,Python,String,Dictionary,我有一个python字典和一个包含一些值的字典。我试图在结构中生成一个以点分隔的键字符串,其值在末尾。在下面的示例中,我需要字段0 1和名称。我可以创建一个for循环来处理数据,或者创建一个递归函数。我不知道是否有什么预构建的方法可以将多级字典折叠为分隔字符串 我尝试了以下内容,但正如您所知,它只会附加子字典 '.'.join('%s %s\n' % i for i in a.items()) {'BOGUS1': 'BOGUS_VAL1', 'BOGUS2': 'BOGUS_VAL1',

我有一个python字典和一个包含一些值的字典。我试图在结构中生成一个以点分隔的键字符串,其值在末尾。在下面的示例中,我需要字段0 1和名称。我可以创建一个for循环来处理数据,或者创建一个递归函数。我不知道是否有什么预构建的方法可以将多级字典折叠为分隔字符串

我尝试了以下内容,但正如您所知,它只会附加子字典

'.'.join('%s %s\n' % i for i in a.items())

{'BOGUS1': 'BOGUS_VAL1',
 'BOGUS2': 'BOGUS_VAL1',
 'FIELD0': {'F0_VAL1': 1, 'F0_VAL2': 2},
 'FIELD1': {'F1_VAL1': 80, 'F1_VAL2': 67, 'F1_VAL3': 100},
 'FOOBAR1': 'FB_VAL1',
 'NAME': 'VALUE'}

BOGUS2.BOGUS_VAL1
.NAME.VALUE
.BOGUS1.BOGUS_VAL1
.FIELD0.{'F0_VAL1': 1, 'F0_VAL2': 2}
.FIELD1.{'F1_VAL2': 67, 'F1_VAL3': 100, 'F1_VAL1': 80}
.FOOBAR1.FB_VAL1

# Wanted results
FIELD0.F0_VAL1 1
FIELD0.F0_VAL2 2
FIELD1.F1_VAL1 80
FIELD1.F2_VAL1 67
FIELD1.F3_VAL1 100
NAME VALUE

像这样的怎么样:

def dotnotation(d, prefix = ''):
    for k, v in d.items():
        if type(v) == type(dict()):
            dotnotation(v, prefix + str(k) + '.')
        else:
            print prefix + str(k) + ' = ' + str(v)
还可以根据存储的类型更改格式。这应该适用于您的示例。

以下是我的方法:

def dotted_keys(dic):
    """ Generated dot notation keys from a dictionary """
    queue = [(None, dic)]  # A queue of (prefix, object)
    while queue:
        prefix, current = queue.pop(0)
        for k, v in current.iteritems():
            if isinstance(v, dict):
                queue.append((k, v))
            elif prefix:
                yield prefix + '.' + k
            else:
                yield k


def dict_search(dic, dotted_key, default=None):
    """ Take a dictionary and a dotted key and return the value. If not
    found, return the value specified by the default parameter.

    Example: dict_search(d, 'FIELD0.F0_VAL2')
    """
    current = dic
    keys = dotted_key.split('.')

    for k in keys:
        if k in current:
            current = current[k]
        else:
            return default
    return current


if __name__ == '__main__':
    d = {
        'BOGUS1': 'BOGUS_VAL1',
        'BOGUS2': 'BOGUS_VAL1',
        'FIELD0': {'F0_VAL1': 1, 'F0_VAL2': 2, 'XYZ': {'X1': 9}},
        'FIELD1': {'F1_VAL1': 80, 'F1_VAL2': 67, 'F1_VAL3': 100},
        'FOOBAR1': 'FB_VAL1',
        'NAME': 'VALUE'
    }

    for k in dotted_keys(d):
        print(k, '=', dict_search(d, k))
输出:

BOGUS2 = BOGUS_VAL1
NAME = VALUE
BOGUS1 = BOGUS_VAL1
FOOBAR1 = FB_VAL1
FIELD0.F0_VAL1 = 1
FIELD0.F0_VAL2 = 2
FIELD1.F1_VAL2 = 67
FIELD1.F1_VAL3 = 100
FIELD1.F1_VAL1 = 80
XYZ.X1 = None

虚线键
函数以虚线表示法生成键列表,而
dict\u search
函数获取虚线键并返回值。

为什么是BOGUS1、BOGUS2、,而FOOBAR1应该在所需的输出中被跳过吗?这些字段存在于JSON中,在这个字符串上下文中我不需要它们,因为它们是静态值,其他字段将不同,名称是标识值集。谢谢,我认为for循环是唯一真实的方式,但python在过去让我惊讶。