python – 基于密钥映射dicts
发布时间:2020-12-20 11:41:30 所属栏目:Python 来源:网络整理
导读:给出一个dicts列表 input = [ {'key': k1,'value': v1},{'key': k1,'value': v2},{'key': k2,'value': v3}] 将这些映射到输出的最简单方法是什么 output == {k1: (v1,v2),k2: (v3)} 我并不关心价值观的顺序.我想出的最好的是. output = dict()for i in input
给出一个dicts列表
input = [ {'key': k1,'value': v1},{'key': k1,'value': v2},{'key': k2,'value': v3} ] 将这些映射到输出的最简单方法是什么 output == {k1: (v1,v2),k2: (v3)} 我并不关心价值观的顺序.我想出的最好的是. output = dict() for i in input: temp = output.get(i['key'],[]) temp.append(i['value']) output[i['key']] = temp 有什么用dict理解这样做的吗?我假设相同的过程也适用于具有属性的对象列表. 解决方法
在词典理解中,任何单个键只能被访问或修改一次.为了确保多个值与单个键配对,则需要预先对这些值进行分组.天真的分组解决方案最多只能具有二次性能.事实上,我不能想出一个比立方更好的单线;这是一个丑陋的野兽,甚至不值得张贴.
因此,基于 但是,如果您的数据保证排序,或者您愿意接受O(n log n)性能,那么您可以使用itertools.groupby. >>> input [{'value': 1,'key': 'a'},{'value': 2,{'value': 3,'key': 'b'}] >>> {k:tuple(d['value'] for d in v) for k,v in ... itertools.groupby(input,key=lambda d: d['key'])} {'a': (1,2),'b': (3,)} 要摆脱难看的lambda,你可以使用operator. >>> {k:tuple(d['value'] for d in v) for k,key=operator.itemgetter('key'))} {'a': (1,)} 或者,如果你必须先排序: >>> {k:tuple(d['value'] for d in v) for k,v in itertools.groupby( ... sorted(input,key=operator.itemgetter('key')),... key=operator.itemgetter('key'))} {'a': (1,)} 这些解决方案都没有吸引力;他们看起来有点像滥用理解语法,可能除了第二个. 作为从集合导入的替代方法,您可以使用setdefault – 尽管这会生成列表而不是元组: >>> output = {} >>> for d in input: ... output.setdefault(d['key'],[]).append(d['value']) ... >>> output {'a': [1,2],'b': [3]} 最后,考虑这个替代方案 – 我不知道我对它的感受,但它确实避免了所有导入和异国情调的功能,并产生元组: >>> output = {d['key']:() for d in input} >>> for d in input: ... output[d['key']] += (d['value'],) ... >>> output {'a': (1,)} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |