对字典进行排序......有效的方法吗?

时间:2016-08-01 15:29:08

标签: python list python-2.7 dictionary

我遇到了这样的问题:我有这样的乘客的字典:

passengers = {
              1: {'name': 'Foo', 'lastname': 'Bar', 'exclusive': True},
              2: {'name': 'John', 'lastname': 'Doe'},
              3: {'name': 'Rocky', 'lastname': 'Balboa', 'exclusive': True},
              4: {'name': 'Mohammed', 'lastname': 'Smith'}
             }

我需要首先打印这些项目的结果,然后是其余的:
这是期望的输出

List of passengers:
===================
1.- Foo Bar
2.- Rocky Balboa
3.- John Doe
4.- Mohammed Smith

我尝试了collections.deque,在找到这个函数之前,我找不到任何对我有用的东西:

def prioritize_passengers(dictionary):
    priority_list = []
    normal_list = []
    sorted_list = []

    for key, item in dictionary.iteritems():
        if 'exclusive' in item:
            priority_list.append(key)
        else:
            normal_list.append(key)

    sorted_list = priority_list + normal_list

    return sorted_list

然后我在我的数据上使用它:

# Assuming passenger is the same var as above
sorted_list = prioritize_passengers(passengers)
print "List of passengers:\n==================="
for elem in sorted_list:
    passenger = passengers[elem]
    print "{} {}".format(passenger['name'], passenger['lastname']

这是唯一的方法吗?还是有更清晰/有效的方法来实现它?同样,第二段是所需的输出。

1 个答案:

答案 0 :(得分:5)

是的,还有其他方法可以对该列表进行排序。这是一个:

passengers = {
              1: {'name': 'Foo', 'lastname': 'Bar', 'exclusive': True},
              2: {'name': 'John', 'lastname': 'Doe'},
              3: {'name': 'Rocky', 'lastname': 'Balboa', 'exclusive': True},
              4: {'name': 'Mohammed', 'lastname': 'Smith'}
             }

list_of_passengers = sorted(
    passengers.items(),
    key=lambda x: (('exclusive' not in x[1]), x[0]))

for i, (_, passenger) in enumerate(list_of_passengers, 1):
    print '{}. - {} {}'.format(i, passenger['name'], passenger['lastname'])

由于您不关心exclusive - ness以外的订单,那么您可能会这样做:

passengers = {
              1: {'name': 'Foo', 'lastname': 'Bar', 'exclusive': True},
              2: {'name': 'John', 'lastname': 'Doe'},
              3: {'name': 'Rocky', 'lastname': 'Balboa', 'exclusive': True},
              4: {'name': 'Mohammed', 'lastname': 'Smith'}
             }

list_of_passengers = sorted(
    passengers.values(), key=lambda x: 'exclusive' not in x)

for i, passenger in enumerate(list_of_passengers, 1):
    print '{}. - {} {}'.format(i, passenger['name'], passenger['lastname'])

最后,如果你真正想做的是创建两个单独的列表,你可以使用filter()内置功能:

upper_crust = filter(lambda x: 'exclusive' in x, passengers.values())
riff_raff = filter(lambda x: 'exclusive' not in x, passengers.values())