2016-08-01 3 views
-1

私はこのような乗客の辞書を持っている問題が持ってきた:
THISを希望する:その後、残りの部分は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'} 
      } 

をそして、私は排他的な最初でこのアイテムのような結果を印刷する必要がありますOUTPUT

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

が唯一の方法はそれを行うためにということですか、それを達成するために、より明確に/効率的な方法がありますか?もう一度、2番目の段落は望ましい出力です。

+0

あなたがやろうとしたかを説明しませんでした:行うには、あなたがfilter()組み込みfuncitonを使用することができ、二つの別々のリストを作成することです。どのようにデータを並べ替えるかを明確に説明し、実際に何をしようとしているのかをリバースエンジニアリングする必要はありません。 –

+0

2番目のコードブロックでは十分ではありませんか?私はとにかくそれを編集します。 –

+0

あなたはOrderedDictしようとすることができますhttps://pymotw.com/2/collections/ordereddict.html – arcticless

答えて

5

はい、他の方法でそのリストを並べ替えることができます。ここでは一つです:あなたは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.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']) 

、その後これはあなたのために働くかもしれない:

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

最後に、あなたが本当にしたい場合はどう

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

ありがとう!ソートされたキー+機能が私を助けました。 –

関連する問題