Yeb*_*ach 7 python dictionary loops list
我在python 2.7中有一个dicts列表.
a =[{'id': 1,'desc': 'smth'},
{'id': 2,'desc': 'smthelse'},
{'id': 1,'desc': 'smthelse2'},
{'id': 1,'desc': 'smthelse3'},....]
Run Code Online (Sandbox Code Playgroud)
我想通过列表找到那些具有相同值的dicts - id(例如id = 1)并创建一个新的dict
b = [{'id':1, 'desc' : [smth, smthelse2,smthelse3]},
{'id': 2, 'desc': 'smthelse'}]
Run Code Online (Sandbox Code Playgroud)
我希望我很清楚
非常感谢你的建议
JBe*_*rdo 11
你可以试试:
import operator, itertools
key = operator.itemgetter('id')
b = [{'id': x, 'desc': [d['desc'] for d in y]}
for x, y in itertools.groupby(sorted(a, key=key), key=key)]
Run Code Online (Sandbox Code Playgroud)
最好将“desc”值保留为列表,即使它们仅包含单个元素。这样你就可以做到
for d in b:
print d['id']
for desc in d['desc']:
print desc
Run Code Online (Sandbox Code Playgroud)
这也适用于字符串,只返回单个字符,这不是您想要的。
现在,解决方案为您提供列表的字典列表:
a =[{'id': 1,'desc': 'smth'},{'id': 2,'desc': 'smthelse'},{'id': 1,'desc': 'smthelse2'},{'id': 1,'desc': 'smthelse3'}]
c = {}
for d in a:
c.setdefault(d['id'], []).append(d['desc'])
b = [{'id': k, 'desc': v} for k,v in c.iteritems()]
Run Code Online (Sandbox Code Playgroud)
b
就是现在:
[{'desc': ['smth', 'smthelse2', 'smthelse3'], 'id': 1},
{'desc': ['smthelse'], 'id': 2}]
Run Code Online (Sandbox Code Playgroud)