我遇到了这样的问题:我有这样的乘客的字典:
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']
这是唯一的方法吗?还是有更清晰/有效的方法来实现它?同样,第二段是所需的输出。
答案 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())