通过在Python中使用for循环从dict获取数据

时间:2015-11-04 06:18:36

标签: python for-loop dictionary

我的输入是

[['apple',{'john':3,'anna':4,'kitty':6}],['pear',{'john':4,'anna':3,'kitty':3}]]

预期产出:

{
    'key':['apple','pear'],
    'value':[
        {
            'name':'john',
            'data':[3,4]
        },
        {
            'name':'anna',
            'data':[4,3]
        },
        {
            'name':'kitty',
            'data':[6,3]
        }
    ]
}

key是一个列出每个项目第一部分的列表,例如' apple' ' pear',value是另一个列表。

我该怎么办?

4 个答案:

答案 0 :(得分:2)

您可以在collections.defaultdict

的帮助下实现这一目标
from collections import defaultdict
value, key = defaultdict(list), []

for x in l:
    key.append(x[0])
    for k, v in x[1].items():
        value[k].append(v)

要获得结果:

In [15]: {'key': key, 'value': [{'name': k, 'data': v} for k, v in value.items()]}
Out[15]: 
{'key': ['apple', 'pear'],
 'value': [
  {'data': [4, 3], 'name': 'anna'},
  {'data': [6, 3], 'name': 'kitty'},
  {'data': [3, 4], 'name': 'john'}]}

对于更高效的(?)版本,子类defaultdict来自定义默认的__missing__挂钩,以将缺少键作为参数调用default_factory(我复制了此文本和实现来自other answer of mine)。然后你就可以一次性完成这个任务:

from collections import defaultdict

class mydefaultdict(defaultdict):
    def __missing__(self, key):
        self[key] = value = self.default_factory(key)
        return value

# pass 'name' to the dictionary
value = mydefaultdict(lambda name: {'name': name, 'data': []})
key = []

for x in l:
    key.append(x[0])
    for k, v in x[1].items():
        value[k]['data'].append(v)

结果是

In [24]: {'key': key, 'value': value.values()}
Out[24]: 
{'key': ['apple', 'pear'],
 'value': [
  {'data': [4, 3], 'name': 'anna'},
  {'data': [6, 3], 'name': 'kitty'},
  {'data': [3, 4], 'name': 'john'}]}

在Python 3中,您必须致电list(value.values())而不是value.values()才能获得list个对象。

答案 1 :(得分:1)

您可以使用以下代码段:

input = [['apple',{'john':3,'anna':4,'kitty':6}],['pear',{'john':4,'anna':3,'kitty':3}]]

tmp = {}
output = {'key': [], 'value': []}

for item in input:
    output['key'].append(item[0])
    for name in item[1]:
        try:
            tmp[name].append(item[1][name])
        except KeyError:
            tmp[name] = [item[1][name]]

output['value'] = [{'name': name, 'data': data} for name, data in tmp.items()]

答案 2 :(得分:1)

此功能可以帮助您

def map_data(data):
    _tmp = {}
    _keys = []
    for _d in data:
        _keys.append(_d[0])
        for _k in _d[1].keys():
            _v  = _tmp.get(_k)
            if not _v:
                _v = {"name": _k, "data": []}

            _v["data"].append(_d[1][_k])
            _tmp[_k] = _v

    return {"key": _keys, "value": [_v for _v in _tmp.values()]}

答案 3 :(得分:1)

这是我的解决方案:

{
    "value": [
        {
            "name": "john", 
            "value": [
                3, 
                4
            ]
        }, 
        {
            "name": "kitty", 
            "value": [
                6, 
                3
            ]
        }, 
        {
            "name": "anna", 
            "value": [
                4, 
                3
            ]
        }
    ], 
    "key": [
        "apple", 
        "pear"
    ]
}

输出:

>>> name_dict
[{'john': [3], 'kitty': [6], 'anna': [4]}, {'john': [4], 'kitty': [3], 'anna': [3]}]

编辑:

嗯,刚刚找到了合并dict值的更好方法。

如果name_dict看起来像这样:

collections.Counter

任务很简单。有什么区别?该值是一个列表。

现在,我们可以使用>>> Counter(name_dict[0]) + Counter(name_dict[1]) Counter({'kitty': [6, 3], 'anna': [4, 3], 'john': [3, 4]}) 合并两个词组!

  from collections import Counter 

  my_list = [['apple',{'john':3,'anna':4,'kitty':6}],['pear',{'john':4,'anna':3,'kitty':3}]]
  name_list = [item[1] for item in my_list]    

  for item in name_list:                                                          
      for key, value in item.items():                                             
          item[key] = [value]                                                     

  name_values = dict(Counter(name_list[0]) + Counter(name_list[1]))  # {'john': [3, 4], 'kitty': [6, 3], 'anna': [4, 3]}             

  print([{'name': name, 'value': value} for (name, value) in name_values.items()])

  # output
  [{'name': 'john', 'value': [3, 4]}, {'name': 'kitty', 'value': [6, 3]}, {'name': 'anna', 'value': [4, 3]}]

所以这是新的解决方案,我们首先将值转换为列表:(跳过'键',只显示'值'):

// Searches automatically for first matching id

var idArray = $("div[id^='x-']")        // find spans with ID attribute
    .map(function() { return this.id; })// convert to set of IDs
    .get();                             // convert to instance of Array (optional)

navbarHeight = $('#fixed-navbar').height();

console.log(idArray);

$('#search-box').keyup(function () {

    for (var i=0; i<idArray.length; i++) {

        var input = $('#search-box').val().replace(/\s+/g, '').toLowerCase();
        matched = idArray[i].match(new RegExp(input));

        if (matched !== null) {
            $('html, body').animate({scrollTop:$('#'+ idArray[i]).position().top - window.navbarHeight});
            console.log('Matched part: ' + matched);
            break;
        };

        if (matched == undefined) {
            matched = [];
            matched.length = 0;
        };
    };
});