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

2024-09-27 04:20:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个密码:

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

最后我想要两本字典:

newdict_valueA = {'a':[1, 2], 'b':[3,4]}
newdict_valueB = {'a':[0.1, 0.2], 'b':[0.3,0.4]}

一个解决方案是使用列表,但我必须创建许多列表,循环它们,附加等等

thedata上有没有更干净/更快的解决方案?你知道吗


Tags: selfformat密码列表return字典initdef
3条回答

对于字典中的每个键,可以在列表中列出所有期望的项。只需循环thedata的项,并为每个键创建一个字典,其中包含valueAvalueB的单独项。对于这个任务,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()方法:

In [33]: d = defaultdict(lambda: defaultdict(list))

In [34]: for i, j in thedata.items():
             for instance in j:
                 d[i]['valueA'].append(instance.valueA)
                 d[i]['valueB'].append(instance.valueB)
   ....:         

In [35]: d
Out[35]: defaultdict(<function <lambda> at 0x7fb5888786a8>,
         {'a': defaultdict(<class 'list'>,
               {'valueB': [0.1, 0.2], 'valueA': [1, 2]}),
          'b': defaultdict(<class 'list'>,
               {'valueB': [0.3, 0.4], 'valueA': [3, 4]})})

如果我答对了你的问题,你可以用理解法:

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

像这样的方法会奏效:

# 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]

新的价值观:

{'a': [1, 2], 'b': [3, 4]}

新dict\u valueB:

{'a': [0.1, 0.2], 'b': [0.3, 0.4]}

相关问题 更多 >

    热门问题