2016-08-01 7 views
-1

У меня есть проблема, когда у меня есть Dict пассажиров, как это:Сортировка dict ... эффективный способ сделать это?

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

ответ

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']) 

Наконец, если то, что вы действительно хотите сделать это, чтобы создать два отдельных списка, вы можете использовать встроенный funciton filter():

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

Спасибо! помогла мне функция key +. –

Смежные вопросы