一些字典操作的Pythonic解决方案

2024-04-16 04:39:59 发布

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

我有以下词典:

{'dev1': {'beacons': [{'mac_address': '11:22:33:44:55:66', 'rssi': 5},
                      {'mac_address': 'ab:bc:cd:de:ef', 'rssi': 22}],
          'mac_addr': '43:34:23:66:11:aa'},
 'dev2': {'beacons': [{'mac_address': '11:22:33:44:55:66', 'rssi': 15},
                      {'mac_address': 'ab:bc:cd:de:ef', 'rssi': 33}],
          'mac_addr': '32:32:54:12:dd:ff'},
 'dev3': {'beacons': [{'mac_address': '11:22:33:44:55:66', 'rssi': 30},
                      {'mac_address': 'ab:bc:cd:de:ef', 'rssi': 44}],
          'mac_addr': '43:fs:43:ha:bb:11'}}

我想把它变成

{'mac_address': '11:22:33:44:55:66', 'rssi': [5, 15, 30]}

对于每个唯一的mac\u addr组,将所有其他属性放在一起。我想把它从dev-1/2/3的角度变成一个灯塔的角度。其他键也可用,因此它应该与多个键一起工作。你知道吗

它可以手动操作,有些用于循环等等。我只是想知道有没有一个Python的方式?你知道吗

我试过groupby和chain,但到目前为止没有任何运气。你知道吗


Tags: dev1abaddressmacdev2cdde词典
2条回答

您可以使用itertools和列表理解

import itertools
data = {'dev1': {'beacons': 
                   [{'mac_address': '11:22:33:44:55:66', 'rssi': 5},
                    {'mac_address': 'ab:bc:cd:de:ef', 'rssi': 22}],
                'mac_addr': '43:34:23:66:11:aa'},
        'dev2': {'beacons': 
                   [{'mac_address': '11:22:33:44:55:66', 'rssi': 15},
                    {'mac_address': 'ab:bc:cd:de:ef', 'rssi': 33}],
                'mac_addr': '32:32:54:12:dd:ff'},
        'dev3': {'beacons': 
                   [{'mac_address': '11:22:33:44:55:66', 'rssi': 30},
                   {'mac_address': 'ab:bc:cd:de:ef', 'rssi': 44}],
                'mac_addr': '43:fs:43:ha:bb:11'}}

# flatten the list into
#  [{'rssi':... , 'mac_address': ...},
#   {'rssi': ..., ... ]
flattened = [datum for datum in dev['beacons'] 
                   for dev in data.values()]

result = [ 
           {'rssi': rssi, 
            'mac_address' : [record['mac_address'] for record in records] }

           for rssi, records in itertools.groupby(
             flattened, lambda datum: datum['rssi'])
         ]
def list_dict(seq, seq_factory=None):    
    """
       construct a dictionary key -> list(values).

       Works much like dict(seq) but allows repetition of keys
    """
    d = collections.defaultdict(seq_factory or list)    
    for k, v in seq:    
        d[k].append(v)    
    return d

list_dict(
   (b['mac_address'], b['rssi']) for d in data.values() for b in d['beacons']
)

但我真的怀疑嵌套列表理解的可读性。你知道吗

相关问题 更多 >