python - Sorting a dict...efficient way to do it? -


i've have problem have dict of passengers this:

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'}              } 

and need print results items exclusive first rest:
this desired output

list of passengers: =================== 1.- foo bar 2.- rocky balboa 3.- john doe 4.- mohammed smith 

i tried collections.deque, , haven't found works me, until came function:

def prioritize_passengers(dictionary):     priority_list = []     normal_list = []     sorted_list = []      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 

and use on data this:

# assuming passenger same var above sorted_list = prioritize_passengers(passengers) print "list of passengers:\n===================" elem in sorted_list:     passenger = passengers[elem]     print "{} {}".format(passenger['name'], passenger['lastname'] 

is way or there more clear/efficient way achieve it? again, second paragraph desired output.

yes, there other ways sort list. here one:

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]))  i, (_, passenger) in enumerate(list_of_passengers, 1):     print '{}. - {} {}'.format(i, passenger['name'], passenger['lastname']) 

since don't care order other exclusive-ness, might work you:

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)  i, passenger in enumerate(list_of_passengers, 1):     print '{}. - {} {}'.format(i, passenger['name'], passenger['lastname']) 

finally, if want create 2 separate lists, can use filter() builtin funciton:

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

Comments