如何使用嵌套dicts展平dicts列表

时间:2017-08-21 14:05:43

标签: python python-2.7 recursion

我想要列出一个dict列表,但有问题,

让我说我有一个dict列表,

bits

我想要的输出是,

float

我正在使用以下功能

d = [{'val': 454,'c': {'name': 'ss'}, 'r': {'name1': 'ff'}},{'val': 'ss', 'c': {'name': 'ww'}, 'r': {'name1': 'ff'}}, {'val': 22,'c': {'name': 'dd'}, 'r': {'name1': 'aa'}}]

现在,我遇到的问题是,它只生成dict中的第一个元素

2 个答案:

答案 0 :(得分:1)

你可能在错误的地方初始化了一些东西。看看下面的代码:

d = [{'val': 454, 'c': {'name': 'ss'}, 'r': {'name1': 'ff'}}, {'val': 55, 'c': {'name': 'ww'}, 'r': {'name1': 'ff'}}, {'val': 22, 'c': {'name': 'dd'}, 'r': {'name1': 'aa'}}]
#                                                                     ^ typo here

def flatten(my_dict):
    res = []
    for sub in my_dict:
        print(sub)
        dict_ = {}
        for k, v in sub.items():
            if isinstance(v, dict):
                for k_new, v_new in v.items():
                    dict_[k_new] = v_new
            else:
                dict_[k] = v
        res.append(dict_)
    return res

result = flatten(d)
print(result)  # [{'name': 'ss', 'name1': 'ff', 'val': 454}, {'name': 'ww', 'name1': 'ff', 'val': 55}, {'name': 'dd', 'name1': 'aa', 'val': 22}]

答案 1 :(得分:0)

您应该flattenedstructure初始化为与None None相同的类型,并在list案例递归时传递def flatten_2(structure, key="", flattened=None): if flattened is None: flattened = {} if isinstance(structure, dict) else [] if type(structure) not in(dict, list): flattened[key] = structure elif isinstance(structure, list): for i, item in enumerate(structure): flattened.append(flatten(item, "%d" % i)) else: for new_key, value in structure.items(): flatten(value, new_key, flattened) return flattened In [13]: flatten_2(d) Out[13]: [{'name': 'ss', 'name1': 'ff', 'val': 454}, {'name': 'ww', 'name1': 'ff', 'val': 'ss'}, {'name': 'dd', 'name1': 'aa', 'val': 22}]

// Import events module
var events = require('events');

// Event emitter
var eventEmitter = new events.EventEmitter();

var max = 1000;

var count = 0;

eventEmitter.on('event', () => {
    let time = Math.trunc(Math.random() * 1000) +1;
    setTimeout(() => {  
        var c = count;
        c++;
        count = c;
        console.log(c);  
    }, time);
});

// Fire
for (let i = 0; i < max; i++) {
    eventEmitter.emit('event');
}

console.log('Program Ended.');

这当然只适用于有限类型的数据。