如何在Python中对此数据结构进行排序?
我有一个数据结构(从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
等
我想处理每个元素的顺序由'Offset'定义,但我似乎无法做到这一点。我已阅读并重新阅读72899问题,但这似乎更复杂一些。
哪里data
为您发布的字典:
sorted(data.items(), key=lambda i: i[1]['Offset'])
既然这也适用于Python 3,我选择这个作为最佳答案。另外,在phihag的答案前1分钟。 – Makis 2012-02-16 13:27:40
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,我在想同样的思路。请注意,lambda(k,v):v ['Offset']'在Python 3中不受支持,因此它将被写为'lambda p:p [1] ['Offset']'。 – 2012-02-16 13:19:53
@DanD。 - 我一直在Python 2.x中思考,这也是我为什么使用'.iteritems()'的原因。 – eumiro 2012-02-16 13:21:41
这是我如何玩与它:
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])
您可以使用sorted
的key
说法。假设ds
是从YAML读取字典:
sortedByOffset = sorted(ds.items(), key=lambda item: item[1]['Offset'])
对于懒:问题72899](http://stackoverflow.com/q/ 72899/566644) – 2012-02-16 13:30:21