排序字典...有效的方式来做到这一点?
问题描述:
我一直有这个问题,我有乘客这样一个字典:排序字典...有效的方式来做到这一点?
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']
这是唯一的办法做到这一点还是有一个更清晰/有效的方式来实现呢?再次,第二段是期望的输出。
答
是的,还有其他的方法来排序该列表。这里是一个:
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())
+0
谢谢!排序键+功能帮助我。 –
你没有解释你正在尝试做什么。你应该清楚地解释你想如何分类你的数据,所以我们不需要通过你的代码来反向设计你实际要做的事情。 –
第二块代码对你来说还不够吗?无论如何,我会编辑它。 –
你可以尝试OrderedDict https://pymotw.com/2/collections/ordereddict.html – arcticless