如何对字典进行不区分大小写的排序并将它们存储在OrderedDict中

时间:2015-06-06 08:54:41

标签: python sorting

我有以下字典:

named_sets  = {'DMXAA':set(['1441326_at', '1460062_at']), 'cdiGMP':set(['1441326_at', '1460062_at']),'cGAMP': set(['1441326_at', '1460062_at'])  }

我想要做的是使用不区分大小写来执行密钥排序 并将它们存储在OrderedDict中产生:

OrderedDict([ 
               ('cdiGMP', set(['1441326_at', '1460062_at'])),
               ('cGAMP', set(['1441326_at', '1460062_at'])),
               ('DMXAA', set(['1441326_at', '1460062_at'])),        
            ])

我尝试了但失败了:

from collections import OrderedDict
named_sets  = {'DMXAA':set(['1441326_at', '1460062_at']), 'cdiGMP':set(['1441326_at', '1460062_at']),'cGAMP': set(['1441326_at', '1460062_at'])  }
OrderedDict(sorted(named_sets.items()))

给出:

OrderedDict([('DMXAA', set(['1441326_at', '1460062_at'])), ('cGAMP', set(['1441326_at', '1460062_at'])), ('cdiGMP', set(['1441326_at', '1460062_at']))])

1 个答案:

答案 0 :(得分:3)

您需要提供key函数来对案例不敏感地进行排序。

在Python 3上你使用str.casefold() function,在Python 2上坚持str.lower()很好:

OrderedDict(sorted(named_sets.items(), key=lambda i: i[0].lower()))

注意lambda;您正在排序键值对,但set对象不可订购,因此您只想返回密钥,折叠后无需比较即可进行比较。

演示:

>>> from collections import OrderedDict
>>> named_sets  = {'DMXAA':set(['1441326_at', '1460062_at']), 'cdiGMP':set(['1441326_at', '1460062_at']),'cGAMP': set(['1441326_at', '1460062_at'])  }
>>> OrderedDict(sorted(named_sets.items(), key=lambda i: i[0].lower()))
OrderedDict([('cdiGMP', set(['1441326_at', '1460062_at'])), ('cGAMP', set(['1441326_at', '1460062_at'])), ('DMXAA', set(['1441326_at', '1460062_at']))])
>>> _.keys()
['cdiGMP', 'cGAMP', 'DMXAA']