我有这段代码:
class B():
def __init__(self, valueA, valueB ):
self.valueA = valueA
self.valueB = valueB
def __repr__(self):
return 'B({0},{1})'.format(self.valueA, self.valueB)
我的数据是:
thedata = {'a': [B(1, 0.1),B(2, 0.2)],
'b': [B(3, 0.3),B(4, 0.4)]}
我想要做的是根据密钥从上面的字典中提取a
和b
属性到2个新字典。
所以,我想:
thedata_a_valueA = {'a':[1, 2]}
thedata_a_valueB = {'a':[0.1, 0.2]}
thedata_b_valueA = {'b':[3, 4]}
thedata_b_valueB = {'b':[0.3, 0.4]}
最后我想要2个词典:
newdict_valueA = {'a':[1, 2], 'b':[3,4]}
newdict_valueB = {'a':[0.1, 0.2], 'b':[0.3,0.4]}
一种解决方案是使用列表,但我必须创建相当多的列表,循环它们,追加等等
是否有更清洁/更快的解决方案适用于thedata
?
答案 0 :(得分:1)
这样的事情会起作用:
# Starting from two empty dictionaries
newdict_valueA, newdict_valueB = {}, {}
# Iterate over the key/value pairs of the data
for key, value in thedata.items():
# assign to the same key of each result dictionary a list of
# the valueA for each B item in the value of the original dictionary
newdict_valueA[key] = [item.valueA for item in value]
newdict_valueB[key] = [item.valueB for item in value]
newdict_valueA:
{'a': [1, 2], 'b': [3, 4]}
newdict_valueB:
{'a': [0.1, 0.2], 'b': [0.3, 0.4]}
答案 1 :(得分:0)
您可以在字典中为每个键的列表中包含所有预期的项目。您只需循环CL-USER 111 > ((lambda (x &optional (y 0) (z 0))
(+ x y z))
1
2
3)
6
CL-USER 112 > (apply (lambda (x &optional (y 0) (z 0))
(+ x y z))
'(1 2 3))
6
项,并为每个键创建一个字典,其中包含thedata
和valueA
的单独项目。 valueB
属性是此任务的不错选择。
dict.setdefault()
请注意,作为一种更简洁的方式,您可以使用In [18]: d = {}
In [19]: for i, j in thedata.items():
for instance in j:
d.setdefault(i, {}).setdefault('valueA', []).append(instance.valueA)
d.setdefault(i, {}).setdefault('valueB', []).append(instance.valueB)
In [20]: d
Out[21]:
{'a': {'valueB': [0.1, 0.2], 'valueA': [1, 2]},
'b': {'valueB': [0.3, 0.4], 'valueA': [3, 4]}}
代替collections.defaultdict()
方法:
dict.setdefault()
答案 2 :(得分:0)
如果我的问题是对的,你可以使用理解:
newdict_valueA = { k : [ b.valueA for b in l ] for k, l in thedata.items() }
newdict_valueB = { k : [ b.valueB for b in l ] for k, l in thedata.items() }