基于值索引和字母顺序排序Python字典

3

我正在尝试对一个Python字典进行排序,但遇到了一些问题。该字典的格式如下:{UID: Name, Type}。

dic1={"720155": ["CAT", "Software"], "356d05": ["ESF", "Software"], "3b3758": ["DBA", "Software"], "9649db": ["Fun", "Software"], "96493f": ["Eagle", "Software"], "99701d": ["Pas", "Software"], "964971": ["Debug", "Software"], "b6f315": ["Bap", "Software"], "a0a824": ["Server", "Software"], "1e00sa": ["Adobe", "Software"], "8c8dd2": ["EXIT", "Software"], "cc1dfg": ["email", "Software"]}

我使用 sorted(dic1.iteritems(), key=operator.itemgetter(1)) 但这样会使"email"项排在"Debug"名称之后,具体可见下图:
[('1e00sa', ['Adobe', 'Software']), 
('b6f315', ['Bap', 'Software']), 
('720155',['CAT', 'Software']), 
('3b3758', ['DBA', 'Software']), 
('964971', ['Debug', 'Software']), 
('356d05', ['ESF', 'Software']), 
('8c8dd2', ['EXIT', 'Software']), 
('96493f', ['Eagle', 'Software']), 
('9649db', ['Fun', 'Software']), 
('99701d', ['Pas', 'Software']), 
('a0a824', ['Server', 'Software']), 
('cc1dfg', ['email', 'Software'])]

我尝试使用 sorted(sorted(dic1.iteritems(), key=operator.itemgetter(1)), key=str.lower),但是这会出现错误,提示接收到的是一个元组而不是一个字符串。
有什么想法吗?我不能改变字典的形式,它必须保持原样。

列表的第一个元素,也就是字典值,是否唯一?也就是说,你可以同时拥有["CAT", "Software"]["CAT", "Furry"]吗? - Robᵩ
请包含您尝试过的代码、失败的代码、输入集和观察到的输出集,这样做会得到额外的加分。这是一个有用的问题! - Robᵩ
格式中的“UID”是唯一的项目。可能会有两个相同的“名称”。 - ljman711
1个回答

3

你需要一个更复杂的键函数:

sorted(dic1.iteritems(), key=lambda i: i[1][0].lower())

这将按值的第一个元素进行排序,且不区分大小写。

演示:

>>> from pprint import pprint
>>> dic1={"720155": ["CAT", "Software"], "356d05": ["ESF", "Software"], "3b3758": ["DBA", "Software"], "9649db": ["Fun", "Software"], "96493f": ["Eagle", "Software"], "99701d": ["Pas", "Software"], "964971": ["Debug", "Software"], "b6f315": ["Bap", "Software"], "a0a824": ["Server", "Software"], "1e00sa": ["Adobe", "Software"], "8c8dd2": ["EXIT", "Software"], "cc1dfg": ["email", "Software"]}
>>> pprint(sorted(dic1.iteritems(), key=lambda i: i[1][0].lower()))
[('1e00sa', ['Adobe', 'Software']),
 ('b6f315', ['Bap', 'Software']),
 ('720155', ['CAT', 'Software']),
 ('3b3758', ['DBA', 'Software']),
 ('964971', ['Debug', 'Software']),
 ('96493f', ['Eagle', 'Software']),
 ('cc1dfg', ['email', 'Software']),
 ('356d05', ['ESF', 'Software']),
 ('8c8dd2', ['EXIT', 'Software']),
 ('9649db', ['Fun', 'Software']),
 ('99701d', ['Pas', 'Software']),
 ('a0a824', ['Server', 'Software'])]

这很完美。谢谢!我会研究“lambda”函数/项的。我以前没用过它,看起来很有用。 - ljman711
关键字可能应包含 UID 以创建可预测的排序顺序:key=lambda i:(i[1][0].lower(),i[0]) - Robᵩ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接