簡體   English   中英

根據編號鍵對字典進行排序

[英]Sort a dict based on numbered keys

我想根據具有“ [0-9] + _ [AZ] +”等模式的鍵對字典進行排序。 我希望按升序排序。

這是我目前的位置:

import operator
myDict = {
        '120_str' : 'value',
        '150_str' : 'value',
        '110_str' : 'value',
        '80_str' : 'value',
        '10_str' : 'value',
        '20_str' : 'value'
        }

sortedDict = sorted(myDict.items(), key=operator.itemgetter(0))

我實際擁有的是:

sortedDict = {
        '10_str' : 'value',
        '110_str' : 'value',
        '120_str' : 'value',
        '150_str' : 'value',
        '20_str' : 'value',
        '80_str' : 'value'
        }

我想擁有的是:

sortedDict = {
        '10_str' : 'value',
        '20_str' : 'value',
        '80_str' : 'value',
        '110_str' : 'value',
        '120_str' : 'value',
        '150_str' : 'value'
        }

使用_分隔的第一個元素( int )作為排序鍵:

sorted(myDict.items(), key=lambda x: int(x[0].split('_')[0]))

使用collections.OrderedDict維護順序:

collections.OrderedDict(sorted(myDict.items(), key=lambda x: int(x[0].split('_')[0])))

例:

In [109]: sorted(myDict.items(), key=lambda x: int(x[0].split('_')[0]))
Out[109]: 
[('10_str', 'value'),
 ('20_str', 'value'),
 ('80_str', 'value'),
 ('110_str', 'value'),
 ('120_str', 'value'),
 ('150_str', 'value')]

In [110]: collections.OrderedDict(sorted(myDict.items(), key=lambda x: int(x[0].split('_')[0])))
Out[110]: 
OrderedDict([('10_str', 'value'),
             ('20_str', 'value'),
             ('80_str', 'value'),
             ('110_str', 'value'),
             ('120_str', 'value'),
             ('150_str', 'value')])
>>> def key(s):
...     n, s = s.split('_', 1)
...     return int(n), s
... 
>>> from collections import OrderedDict
>>> OrderedDict([(k, myDict[k]) for k in sorted(myDict, key=key)])
OrderedDict([('10_str', 'value'),
             ('20_str', 'value'),
             ('80_str', 'value'),
             ('110_str', 'value'),
             ('120_str', 'value'),
             ('150_str', 'value')])

這個怎么樣? 您可以過濾字符串中的數字,然后根據該字典對字典進行排序。

也不需要您使用特定字符進行拆分 以防萬一您的密鑰結構發生更改,它仍然可以正常工作。

sorted(myDict.items(), key=lambda t: int(filter(str.isdigit, t[0])))

您可以嘗試以下方法:

import re
sortedDict = {
    '10_str' : 'value',
    '110_str' : 'value',
    '120_str' : 'value',
    '150_str' : 'value',
    '20_str' : 'value',
    '80_str' : 'value'
    }

final_data = sorted(sortedDict.items(), key=lambda x:int(re.findall('^\d+', x[0])[0]))

輸出:

[('10_str', 'value'), ('20_str', 'value'), ('80_str', 'value'), ('110_str', 'value'), ('120_str', 'value'), ('150_str', 'value')]

這是一種假設輸出為元組列表的方法。 盡管字典可能會在將來出現,但它們不被認為是有序的。

轉換為int后進行排序,然后重新添加字符串格式:

myLst = [(str(k)+'_str', v) for k, v in \
         sorted([(int(k.split('_')[0]), v) for k, v in myDict.items()])]

# [('10_str', 'value'),
#  ('20_str', 'value'),
#  ('80_str', 'value'),
#  ('110_str', 'value'),
#  ('120_str', 'value'),
#  ('150_str', 'value')]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM