如何做不区分大小写的字典并将它们存储在 OrderedDict 中

nev*_*int 5 python sorting

我有以下集合字典:

named_sets  = {'DMXAA':set(['1441326_at', '1460062_at']), 'cdiGMP':set(['1441326_at', '1460062_at']),'cGAMP': set(['1441326_at', '1460062_at'])  }
Run Code Online (Sandbox Code Playgroud)

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

OrderedDict([ 
               ('cdiGMP', set(['1441326_at', '1460062_at'])),
               ('cGAMP', set(['1441326_at', '1460062_at'])),
               ('DMXAA', set(['1441326_at', '1460062_at'])),        
            ])
Run Code Online (Sandbox Code Playgroud)

我试过这个但失败了:

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()))
Run Code Online (Sandbox Code Playgroud)

这给出了:

OrderedDict([('DMXAA', set(['1441326_at', '1460062_at'])), ('cGAMP', set(['1441326_at', '1460062_at'])), ('cdiGMP', set(['1441326_at', '1460062_at']))])
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 7

您需要提供一个key功能来不区分大小写地排序。

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

OrderedDict(sorted(named_sets.items(), key=lambda i: i[0].lower()))
Run Code Online (Sandbox Code Playgroud)

注意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']
Run Code Online (Sandbox Code Playgroud)