2015-09-17 20 views
-1

我有以下字典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_ADDR組中的所有其他屬性一起。我想把它從dev-1/2/3的角度轉化爲燈塔的角度。其他鍵也可用,所以它應該與多個鍵一起使用。

這是可以手動做的,一些for循環等。我只是想知道是否有pythonic方式?

到目前爲止,我嘗試與groupby和鏈沒有任何運氣。

+3

向我們展示你已經使用循環的代碼。 –

+0

通常,「pythonic」的定義是「簡單,易讀,易於理解和維護」 - 所以基於'for'循環的解決方案可能是最pythonic。 –

回答

0
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'] 
) 

但我真的懷疑嵌套列表理解是更具可讀性

0

您可以使用itertools和list解析

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