我有一个列表字典,其中包含我需要合并在一起的名称非常相似的键;例如,
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'
但这显然不起作用。最好的方法是什么?感谢。
答案 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']}