从字典中的类实例中提取值

时间:2017-03-03 09:09:17

标签: python dictionary

我有这段代码:

    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)]}

我想要做的是根据密钥从上面的字典中提取ab属性到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

3 个答案:

答案 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 项,并为每个键创建一个字典,其中包含thedatavalueA的单独项目。 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() }