排序字典...有效的方式来做到这一点?

排序字典...有效的方式来做到这一点?

问题描述:

我一直有这个问题,我有乘客这样一个字典:排序字典...有效的方式来做到这一点?

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

你没有解释你正在尝试做什么。你应该清楚地解释你想如何分类你的数据,所以我们不需要通过你的代码来反向设计你实际要做的事情。 –

+0

第二块代码对你来说还不够吗?无论如何,我会编辑它。 –

+0

你可以尝试OrderedDict https://pymotw.com/2/collections/ordereddict.html – arcticless

是的,还有其他的方法来排序该列表。这里是一个:

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

谢谢!排序键+功能帮助我。 –