2016-08-01 41 views
-1

我一直有這個問題,我有乘客這樣一個字典:排序字典...有效的方式來做到這一點?

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

最後,如果你真的想做的是創建兩個單獨的列表,你可以使用filter()內建函數:

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

謝謝!排序鍵+功能幫助我。 –

相關問題