当值是列表时,如何按值对python中的字典进行排序,我想按列表的第一个索引对其进行排序

时间:2017-03-13 14:05:41

标签: python python-3.x

如果值是列表,是否可以按值对python字典进行排序,我希望它按该列表的第一个值排序。 E.G:

data = {
"Joe" : [1, "Joe", "password", "Joe@Email.com"], 
"Toby" : [2, "Toby", "password", "Toby@Email.com"], 
"John" : [4, "John", "password", "John@Email.com"], 
"Julie" : [3, "Julie", "password", "Julie@Email.com"]
}

我希望它是这样的:哪里'我'是关键

for i in range(len(data)):
    print("UserID: ", str(data[i][0]), ". Username: ", data[i][1])

>> UserID: 1. Username: Joe
>> UserID: 2. Username: Toby
>> UserID: 3. Username: Julie
>> UserID: 4. Username: John

非常感谢。

2 个答案:

答案 0 :(得分:6)

你不能对dict进行排序,因为Python dicts是无序的。您至少有两种选择:

创建元组的排序列表

您可以将sortedkey=参数一起使用。在这种情况下,它将是dict值的第一个元素:

sorted(data.items(), key= lambda x: x[1][0])
# [('Joe', [1, 'Joe', 'password', 'Joe@Email.com']), ('Toby', [2, 'Toby', 'password', 'Toby@Email.com']), ('Julie', [3, 'Julie', 'password', 'Julie@Email.com']), ('John', [4, 'John', 'password', 'John@Email.com'])]

它返回一个元组的排序列表,您可以使用它来迭代并打印结果:

data = {
    "Joe": [1, "Joe", "password", "Joe@Email.com"],
    "Toby": [2, "Toby", "password", "Toby@Email.com"],
    "John": [4, "John", "password", "John@Email.com"],
    "Julie": [3, "Julie", "password", "Julie@Email.com"]
}

for name, lst in sorted(data.items(), key=lambda x: x[1][0]):
    print("UserID : %d. Username : %s" % (lst[0], name))

# UserID : 1. Username : Joe
# UserID : 2. Username : Toby
# UserID : 3. Username : Julie
# UserID : 4. Username : John

创建OrderedDict

如果您想对data进行排序并保留dict的功能,可以创建OrderedDict

from collections import OrderedDict

data = {
    "Joe": [1, "Joe", "password", "Joe@Email.com"],
    "Toby": [2, "Toby", "password", "Toby@Email.com"],
    "John": [4, "John", "password", "John@Email.com"],
    "Julie": [3, "Julie", "password", "Julie@Email.com"]
}

data = OrderedDict(sorted(data.items(), key=lambda x: x[1][0]))
# OrderedDict([('Joe', [1, 'Joe', 'password', 'Joe@Email.com']), ('Toby', [2, 'Toby', 'password', 'Toby@Email.com']), ('Julie', [3, 'Julie', 'password', 'Julie@Email.com']), ('John', [4, 'John', 'password', 'John@Email.com'])])

注意:对于这两个示例,key=lambda x: x[1]也足够了。

答案 1 :(得分:3)

您可以使用itemgetter,这应该按列表对条目进行排序(您可以对列表列表进行排序,默认情况下将按第一个元素排序)。这将返回一个元组列表,第一个元素是键,您可以循环并打印。

import operator

data = {
"Joe" : [1, "Joe", "password", "Joe@Email.com"], 
"Toby" : [2, "Toby", "password", "Toby@Email.com"], 
"John" : [4, "John", "password", "John@Email.com"], 
"Julie" : [3, "Julie", "password", "Julie@Email.com"]
}


sorted_data = sorted(data.items(), key=operator.itemgetter(1))

for entry in (sorted_data):
    print("UserID: " + str(entry[1][0]) + ". Username: " + entry[0])

输出:

UserID: 1. Username: Joe
UserID: 2. Username: Toby
UserID: 3. Username: Julie
UserID: 4. Username: John

注意:sorted_data是元组列表而不是字典的原因是python词典本质上是无序的。请参阅此答案以获得解释:Why is python ordering my dictionary like so?