将python字典转换为唯一键值对

时间:2016-09-21 08:18:13

标签: python list dictionary flatten

我想将python字典转换为包含所有可能的键值对的列表。例如,如果dict是这样的:

[
  { "x": "a1", "b": "c1", "d": "e1" },
  { "x": "a1", "b": "c1", "d": "e2" },
  { "x": "a1", "b": "c2", "d": "e3" },
  { "x": "a1", "b": "c2", "d": "e4" },
  { "x": "a2", "b": "c3", "d": "e1" },
  { "x": "a2", "b": "c3", "d": "e5" },
  { "x": "a2", "b": "c4", "d": "e6" }
]

我想得到一个列表:

def get_list(groups, partial_row):
    row = []
    for k, v in groups.items():
        if isinstance(v, dict):
            for k2, v2 in v.items():
                partial_row.update({k: k2})
                if isinstance(v2, dict):
                    row.extend(get_list(v2, partial_row))
                else:
                    row.append(partial_row)

    return row

我正在努力编写一个递归函数。 我写过这个,但它不起作用

DateTime

3 个答案:

答案 0 :(得分:1)

替代解决方案:

var myStringArray = [{
  "people": [{
    "id": "123",
    "name": "name 1"
  }, {
    "id": "456",
    "name": "name 2"
  }]
}];

var arrayLength = myStringArray.length;

for (var i = 0; i < arrayLength; i++) {            
  console.log(myStringArray[i].id);
}

输出:

from pprint import pprint
dic = {
    "x": {
            "a1": { "b": {
                            "c1": { "d": { "e1": {}, "e2": {} } },
                            "c2": { "d": { "e3": {}, "e4": {} } }
                        }
                },
            "a2": { "b": {
                            "c3": { "d": { "e1": {}, "e5": {} } },
                            "c4": { "d": { "e6": {} } }
                        }
                 }
       }
}


def rec(dic, path=[], all_results=[]):
    if not dic:
        # No items in the dictionary left, add the path
        # up to this point to all_results

        # This is based on the assumption that there is an even
        # number of items in the path, otherwise you output format
        # makes no sense
        even_items = path[::2]
        odd_items = path[1::2]
        result = dict(zip(even_items, odd_items))
        all_results.append(result)
        return all_results

    for key in dic:
        # Make a copy of the current path
        path_cp = list(path)
        path_cp.append(key)
        all_results = rec(dic[key], path_cp, all_results)

    return all_results


results = rec(dic)

pprint(results)

答案 1 :(得分:0)

a = {
"x": {
    "a1": { "b": {
                    "c1": { "d": { "e1": {}, "e2": {} } },
                    "c2": { "d": { "e3": {}, "e4": {} } }
                }
        },
    "a2": { "b": {
                    "c3": { "d": { "e1": {}, "e5": {} } },
                    "c4": { "d": { "e6": {} } }
                }
         }
}
}


def print_dict(d, depth, *arg):
    if type(d) == dict and len(d):
        for key in d:
            if not len(arg):
                new_arg = key
            else:
                new_arg = arg[0] + (': ' if depth % 2 else ', ') + key
            print_dict(d[key], depth+1, new_arg)
    else:
        print(arg[0])

print_dict(a, depth=0)

结果:

x: a1, b: c1, d: e1
x: a1, b: c1, d: e2
x: a1, b: c2, d: e4
x: a1, b: c2, d: e3
x: a2, b: c4, d: e6
x: a2, b: c3, d: e1
x: a2, b: c3, d: e5

答案 2 :(得分:0)

您在原始解决方案的以下部分中缺少一个条件检查:

if isinstance(v2, dict):
    row.extend(get_list(v2, partial_row))
else:
    row.append(partial_row)

相反,它必须是

if isinstance(v2, dict) and v2:
    row.extend(get_list(v2, partial_row))
else:
    row.append(partial_row)

由于缺少and v2else块永远不会被执行,因此您总是得到空列表。