我的输入是
[['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
是另一个列表。
我该怎么办?
答案 0 :(得分:2)
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;
};
};
});