2017-04-25 20 views
2

文字列が辞書のキーと値のペアであり、ペアの値でソートされた辞書から文字列のリストを作成する必要があります。これらは私のキーと値のペアであれば、例えば:値が同じであれば、それは同様にアルファベット順にソートされていることを辞書のキーと値から文字列を作成する

["DDD 3 1 0", "BBB 0 1 0", "AAA 0 0 1", "CCC 0 0 1"] 

注:

d = {'AAA': [0, 0, 1], 'BBB': [0, 1, 0], 'CCC': [0, 0, 1], 'DDD': [3, 1, 0]} 

を私は返す必要があります。どのように私はこれを行うことについて行くことができるかについての任意の提案?

私はあなただけしたいと思います
+0

キーと値のペアを繰り返します。キーと値から文字列を作成します。 – wwii

答えて

4

をあなたがで降順に辞書を並べ替えることができ値:

リスト内包で、その後3210
>>> sorted_d = sorted(d.items(), key=lambda x: x[1], reverse=True) 

と「スペックあたり」の項目をフォーマット:

>>> ['{k} {v[0]} {v[1]} {v[2]}'.format(k=k, v=v) for k, v in sorted_d] 
['DDD 3 1 0', 'BBB 0 1 0', 'AAA 0 0 1', 'CCC 0 0 1'] 

私は実際に等しい値の場合には、あなただけの事故で起こったことを(キーでソートする要件を逃しました - 辞書は順不同です)。値によって、その後

  • まずキーによるソート(逆ではない)と(逆):

    >>> from operator import itemgetter 
    >>> sorted_d = sorted(d.items(), key=itemgetter(0)) 
    >>> sorted_d = sorted(sorted_d, key=itemgetter(1), reverse=True) 
    >>> ['{k} {v[0]} {v[1]} {v[2]}'.format(k=k, v=v) for k, v in sorted_d] 
    ['DDD 3 1 0', 'BBB 0 1 0', 'AAA 0 0 1', 'CCC 0 0 1'] 
    
  • それともまったく同じ比較カスタムクラスを作成することを解決する方法はいくつかあります残りは、比較器に焼いたreverse=True一部を除き、ほぼ同じまま

    class Compare(object): 
        def __init__(self, key_value_pair): 
         self.data = key_value_pair 
    
        def __lt__(self, other): 
         key1, value1 = self.data 
         key2, value2 = other.data 
         if value1 == value2: 
          return key1 < key2 
         else: 
          return value1 > value2 
    

    :あなたはそれを必要

    >>> sorted_d = sorted(d.items(), key=Compare) 
    >>> ['{k} {v[0]} {v[1]} {v[2]}'.format(k=k, v=v) for k, v in sorted_d] 
    ['DDD 3 1 0', 'BBB 0 1 0', 'AAA 0 0 1', 'CCC 0 0 1'] 
    
1

sorted(["%s %s" % (k, ' '.join(map(str, v))) for k, v in d.items()])

は編集:

私はあなたのソート要件を理解している場合:

sorted(["%s %s" % (k, ' '.join(map(str, v))) for k, v in d.items()], key=lambda x: x.split(' ')[1], reverse=True)

+0

これは非常に役に立ちますが、どのように辞書の値の最初の数値でソートできますか? –

+0

それはもっと近いですが、私は最初の最大の数字が最初で、その数字がネクタイであれば、次の数字でソートし、それがネクタイであれば次の番号。例えば、「AAA 1 0 0」、「CCC 0 1 0」、「BBB 0 1 0」、「DDD 0 0 1」の場合、「AAA 1 0 0」、「CCC 0 0 0」、 1 0 "、" BBB 0 1 0 "、" DDD 0 0 1 "] –

+1

@ ari.montarioあなたの質問は上記の通りです。あなたはあなたの質問に要件を追加し続けるべきではありません。さらなる要件がある場合は、別の質問をすることをお勧めします。これはあなたと潜在的な回答者のために有利です。より多くのポイントが提供されているので、回答者を質問と回答のセッションにドラッグして投票することはありません。 –

関連する問題