按键名合并字典值

时间:2018-02-09 16:41:37

标签: python dictionary

我有一个列表字典,其中包含我需要合并在一起的名称非常相似的键;例如,

new_dict = {
    'a0':['hello', 'how'],
    'a1':['are'],
    'a2':['you'],
    'b0':['fine'],
    'b1':['thanks']
}

我想要这样的事情:

desired = {
    'a':['hello', 'how', 'are', 'you'],
    'b':['fine', 'thanks']
}

我虽然可以更改密钥,就好像它是一个列表元素,如下所示:

for key in new_dict.keys():
    if 'a' in key:
        key == 'a'

但这显然不起作用。最好的方法是什么?感谢。

4 个答案:

答案 0 :(得分:3)

您可以使用defaultdict

from collections import defaultdict

desired = defaultdict(list)

for key, val in new_dict.items():
    desired[key[0]] += val

答案 1 :(得分:3)

这是一种方式:

from collections import defaultdict
d = defaultdict(list)

for k, v in new_dict.items():
    d[k[0]].extend(v)

# defaultdict(list,
#             {'a': ['hello', 'how', 'are', 'you'], 'b': ['fine', 'thanks']})

答案 2 :(得分:0)

正如其他评论中所指出的,defaultdictionary消除了对if else语句的需要。

new_new_dict={}
for k,v in new_dict.items():
    k1 = k[0]
    if k1 in new_new_dict:
        new_new_dict[k1].extend(v) 
    else:
        new_new_dict[k1]=v

答案 3 :(得分:0)

您可以使用itertools.groubpy

import itertools
import re
new_dict = {
'a0':['hello', 'how'],
'a1':['are'],
'a2':['you'],
'b0':['fine'],
'b1':['thanks']
}
final_data = {a:[i for b in map(lambda x:x[-1], list(b)) for i in b] for a, b in itertools.groupby(sorted(new_dict.items(), key=lambda x:re.findall('^[a-zA-Z]+', x[0])[0]), key=lambda x:re.findall('^[a-zA-Z]+', x[0])[0])}

输出:

{'a': ['are', 'hello', 'how', 'you'], 'b': ['fine', 'thanks']}