2012-02-16 3 views
1

У меня есть структура данных (созданный из документа YAML), который выглядит следующим образом:Как отсортировать эту структуру данных в Python?

{ 
    'SD_TX_EN_CFG[5]': {'Bits': {0: 'ENTX // 0 = Disabled, 1 = Enabled'}, 'Name': 'TX Enable Register (Link 5)', 'Offset': 43024}, 
    'SD_TX_EN_CFG[4]': {'Bits': {0: 'ENTX // 0 = Disabled, 1 = Enabled'}, 'Name': 'TX Enable Register (Link 4)', 'Offset': 40976}, 
    'SD_RX_EN_CFG[5]': {'Bits': {0: 'ENRX // 0 = Disabled, 1 = Enabled'}, 'Name': 'RX Enable Register (Link 5)', 'Offset': 43008}, 
    'SD_RX_EN_CFG[3]': {'Bits': {0: 'ENRX // 0 = Disabled, 1 = Enabled'}, 'Name': 'RX Enable Register (Link 3)', 'Offset': 38912}, 
    'SD_RX_EN_CFG[2]': {'Bits': {0: 'ENRX // 0 = Disabled, 1 = Enabled'}, 'Name': 'RX Enable Register (Link 2)', 'Offset': 36864}, 
    'SD_RX_EN_CFG[0]': {'Bits': {0: 'ENRX // 0 = Disabled, 1 = Enabled'}, 'Name': 'RX Enable Register (Link 0)', 'Offset': 32768}, 
    'aif2_scratch': {'Offset': 4, 'Bits': {'0-31': 'scratch'}, 'Description': None, 'Name': 'aif2_scratch'}, 
    'SD_RX_R2_CFG[0]': {'Bits': {'15-16': 'RXLOOPBACK // 00 = Disabled, 11 = Enabled'}, 'Name': 'RX Configuration Register 2 (Link 0)', 'Offset': 32776}, 
    'aif2_pid': {'Offset': 0, 'Bits': {'6-7': 'Custom version code', '8-10': 'Major revision X code // \n Should be 1\n', '0-5': 'Minor revision Y code'}, 'Description': None, 'Name': 'aif2_pid'}, 
    'SD_TX_EN_CFG[1]': {'Bits': {0: 'ENTX // 0 = Disabled, 1 = Enabled'}, 'Name': 'TX Enable Register (Link 1)', 'Offset': 34832}, 
    'SD_TX_EN_CFG[0]': {'Bits': {0: 'ENTX // 0 = Disabled, 1 = Enabled'}, 'Name': 'TX Enable Register (Link 0)', 'Offset': 32784}, 
    'SD_RX_EN_CFG[1]': {'Bits': {0: 'ENRX // 0 = Disabled, 1 = Enabled'}, 'Name': 'RX Enable Register (Link 1)', 'Offset': 34816}, 
    'SD_RX_EN_CFG[4]': {'Bits': {0: 'ENRX // 0 = Disabled, 1 = Enabled'}, 'Name': 'RX Enable Register (Link 4)', 'Offset': 40960}, 
    'SD_TX_R1_CFG[0]': {'Bits': {'15-16': 'TXLOOPBACK // 00 = Disabled, 11 = Enabled'}, 'Name': 'TX Configuration Register 1 (Link 0)', 'Offset': 32788}, 
    'SD_TX_EN_CFG[2]': {'Bits': {0: 'ENTX // 0 = Disabled, 1 = Enabled'}, 'Name': 'TX Enable Register (Link 2)', 'Offset': 36880}, 
    'RM_LK_CFG0[0]': {'Bits': {0: 'Short frame mode // 0 = CPRI, 1 = OBSAI', '2-3': 'Link Rate // 0 = 8x, 1 = 4x, 2 = 2x, 3 = 1x', 1: 'Enable RM Link // 0 = Disabled, 1 = Enabled'}, 'Name': 'RM Link Configuration Register 0 (Link 0)', 'Offset': 327680}, 
    'SD_TX_EN_CFG[3]': {'Bits': {0: 'ENTX // 0 = Disabled, 1 = Enabled'}, 'Name': 'TX Enable Register (Link 3)', 'Offset': 38928} 
} 

Определение YAML выглядит

SD_RX_EN_CFG[0]: 
    Name: RX Enable Register (Link 0) 
    Offset: 0x8000 
    Bits: 
    0: ENRX // 0 = Disabled, 1 = Enabled 

т.д.

Я хотел бы обрабатывать каждый элемент в порядке, определенном «Смещение», но я, похоже, не могу это сделать. Я прочитал и перечитал вопрос 72899, но это кажется немного более сложным.

+0

Для ленивых: [вопрос 72899] (http://stackoverflow.com/q/ 72899/566644) –

ответ

2

Где data является ДИКТ вы вывесили:

sorted(data.items(), key=lambda i: i[1]['Offset']) 
+0

Так как это работает с Python 3, я выбрал это как лучший ответ. Плюс это было за 1 минуту до ответа фигага. – Makis

9
for k, v in sorted(data.iteritems(), key=lambda (k,v): v['Offset']): 
    print k, v['Offset'] 

печатает:

aif2_pid 0 
aif2_scratch 4 
SD_RX_EN_CFG[0] 32768 
SD_RX_R2_CFG[0] 32776 
SD_TX_EN_CFG[0] 32784 
SD_TX_R1_CFG[0] 32788 
SD_RX_EN_CFG[1] 34816 
SD_TX_EN_CFG[1] 34832 
SD_RX_EN_CFG[2] 36864 
SD_TX_EN_CFG[2] 36880 
SD_RX_EN_CFG[3] 38912 
SD_TX_EN_CFG[3] 38928 
SD_RX_EN_CFG[4] 40960 
SD_TX_EN_CFG[4] 40976 
SD_RX_EN_CFG[5] 43008 
SD_TX_EN_CFG[5] 43024 
RM_LK_CFG0[0] 327680 

UPDATE: в Python 3.x вы будете использовать (из-за iteritems и lambda изменений):

for k, v in sorted(data.items(), key=lambda x: x[1]['Offset']): 
    print k, v['Offset'] 

(Это работает в Python 2 .x тоже.)

+1

+1 Я думал по тем же линиям. Обратите внимание, что 'lambda (k, v): v ['Offset']' не поддерживается в Python 3, и для этого он будет записан как 'lambda p: p [1] ['Offset']'. –

+0

@DanD. - Я всегда думаю в Python 2.x, поэтому я использовал '.iteritems()' тоже. – eumiro

0

Вот как я играл с ним:

d={'SD_TX_EN_CFG[5]': {'Bits': {0: 'ENTX // 0 = Disabled, 1 = Enabled'}, 'Name': 'TX Enable Register (Link 5)', 'Offset': 43024}, 'SD_TX_EN_CFG[4]': {'Bits': {0: 'ENTX // 0 = Disabled, 1 = Enabled'}, 'Name': 'TX Enable Register (Link 4)', 'Offset': 40976}, 'SD_RX_EN_CFG[5]': {'Bits': {0: 'ENRX // 0 = Disabled, 1 = Enabled'}, 'Name': 'RX Enable Register (Link 5)', 'Offset': 43008}, 'SD_RX_EN_CFG[3]': {'Bits': {0: 'ENRX // 0 = Disabled, 1 = Enabled'}, 'Name': 'RX Enable Register (Link 3)', 'Offset': 38912}, 'SD_RX_EN_CFG[2]': {'Bits': {0: 'ENRX // 0 = Disabled, 1 = Enabled'}, 'Name': 'RX Enable Register (Link 2)', 'Offset': 36864}, 'SD_RX_EN_CFG[0]': {'Bits': {0: 'ENRX // 0 = Disabled, 1 = Enabled'}, 'Name': 'RX Enable Register (Link 0)', 'Offset': 32768}, 'aif2_scratch': {'Offset': 4, 'Bits': {'0-31': 'scratch'}, 'Description': None, 'Name': 'aif2_scratch'}, 'SD_RX_R2_CFG[0]': {'Bits': {'15-16': 'RXLOOPBACK // 00 = Disabled, 11 = Enabled'}, 'Name': 'RX Configuration Register 2 (Link 0)', 'Offset': 32776}, 'aif2_pid': {'Offset': 0, 'Bits': {'6-7': 'Custom version code', '8-10': 'Major revision X code // \n Should be 1\n', '0-5': 'Minor revision Y code'}, 'Description': None, 'Name': 'aif2_pid'}, 'SD_TX_EN_CFG[1]': {'Bits': {0: 'ENTX // 0 = Disabled, 1 = Enabled'}, 'Name': 'TX Enable Register (Link 1)', 'Offset': 34832}, 'SD_TX_EN_CFG[0]': {'Bits': {0: 'ENTX // 0 = Disabled, 1 = Enabled'}, 'Name': 'TX Enable Register (Link 0)', 'Offset': 32784}, 'SD_RX_EN_CFG[1]': {'Bits': {0: 'ENRX // 0 = Disabled, 1 = Enabled'}, 'Name': 'RX Enable Register (Link 1)', 'Offset': 34816}, 'SD_RX_EN_CFG[4]': {'Bits': {0: 'ENRX // 0 = Disabled, 1 = Enabled'}, 'Name': 'RX Enable Register (Link 4)', 'Offset': 40960}, 'SD_TX_R1_CFG[0]': {'Bits': {'15-16': 'TXLOOPBACK // 00 = Disabled, 11 = Enabled'}, 'Name': 'TX Configuration Register 1 (Link 0)', 'Offset': 32788}, 'SD_TX_EN_CFG[2]': {'Bits': {0: 'ENTX // 0 = Disabled, 1 = Enabled'}, 'Name': 'TX Enable Register (Link 2)', 'Offset': 36880}, 'RM_LK_CFG0[0]': {'Bits': {0: 'Short frame mode // 0 = CPRI, 1 = OBSAI', '2-3': 'Link Rate // 0 = 8x, 1 = 4x, 2 = 2x, 3 = 1x', 1: 'Enable RM Link // 0 = Disabled, 1 = Enabled'}, 'Name': 'RM Link Configuration Register 0 (Link 0)', 'Offset': 327680}, 'SD_TX_EN_CFG[3]': {'Bits': {0: 'ENTX // 0 = Disabled, 1 = Enabled'}, 'Name': 'TX Enable Register (Link 3)', 'Offset': 38928}} 
import pprint 
pprint.pprint(d) 

def f(i): 
    return d[i]['Offset'] 

for i in d: 
    print f(i) 

_list=sorted(d,key=f) 

def process(thing): 
    pass 

for k in _list: 
    process(d[k]) 
2

Вы можете использовать key аргумент sorted. Предполагая ds это словарь вы читаете из YAML:

sortedByOffset = sorted(ds.items(), key=lambda item: item[1]['Offset']) 
Смежные вопросы